home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / automake-1.9 / texinfo.tex (.txt) < prev    next >
Encoding:
Texinfo Document  |  2005-10-13  |  224.9 KB  |  5,814 lines

  1. % texinfo.tex -- TeX macros to handle Texinfo files.
  2. % Load plain if necessary, i.e., if running under initex.
  3. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
  4. \def\texinfoversion{2005-07-05.19}
  5. % Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
  6. % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software
  7. % Foundation, Inc.
  8. % This texinfo.tex file is free software; you can redistribute it and/or
  9. % modify it under the terms of the GNU General Public License as
  10. % published by the Free Software Foundation; either version 2, or (at
  11. % your option) any later version.
  12. % This texinfo.tex file is distributed in the hope that it will be
  13. % useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  14. % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. % General Public License for more details.
  16. % You should have received a copy of the GNU General Public License
  17. % along with this texinfo.tex file; see the file COPYING.  If not, write
  18. % to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  19. % Boston, MA 02110-1301, USA.
  20. % As a special exception, when this file is read by TeX when processing
  21. % a Texinfo source document, you may use the result without
  22. % restriction.  (This has been our intent since Texinfo was invented.)
  23. % Please try the latest version of texinfo.tex before submitting bug
  24. % reports; you can get the latest version from:
  25. %   http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
  26. %   ftp://tug.org/tex/texinfo.tex
  27. %     (and all CTAN mirrors, see http://www.ctan.org).
  28. % The texinfo.tex in any given distribution could well be out
  29. % of date, so if that's what you're using, please check.
  30. % Send bug reports to bug-texinfo@gnu.org.  Please include including a
  31. % complete document in each bug report with which we can reproduce the
  32. % problem.  Patches are, of course, greatly appreciated.
  33. % To process a Texinfo manual with TeX, it's most reliable to use the
  34. % texi2dvi shell script that comes with the distribution.  For a simple
  35. % manual foo.texi, however, you can get away with this:
  36. %   tex foo.texi
  37. %   texindex foo.??
  38. %   tex foo.texi
  39. %   tex foo.texi
  40. %   dvips foo.dvi -o  # or whatever; this makes foo.ps.
  41. % The extra TeX runs get the cross-reference information correct.
  42. % Sometimes one run after texindex suffices, and sometimes you need more
  43. % than two; texi2dvi does it as many times as necessary.
  44. % It is possible to adapt texinfo.tex for other languages, to some
  45. % extent.  You can get the existing language-specific files from the
  46. % full Texinfo distribution.
  47. % The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
  48. \message{Loading texinfo [version \texinfoversion]:}
  49. % If in a .fmt file, print the version number
  50. % and turn on active characters that we couldn't do earlier because
  51. % they might have appeared in the input file name.
  52. \everyjob{\message{[Texinfo version \texinfoversion]}%
  53.   \catcode`+=\active \catcode`\_=\active}
  54. \message{Basics,}
  55. \chardef\other=12
  56. % We never want plain's \outer definition of \+ in Texinfo.
  57. % For @tex, we can use \tabalign.
  58. \let\+ = \relax
  59. % Save some plain tex macros whose names we will redefine.
  60. \let\ptexb=\b
  61. \let\ptexbullet=\bullet
  62. \let\ptexc=\c
  63. \let\ptexcomma=\,
  64. \let\ptexdot=\.
  65. \let\ptexdots=\dots
  66. \let\ptexend=\end
  67. \let\ptexequiv=\equiv
  68. \let\ptexexclam=\!
  69. \let\ptexfootnote=\footnote
  70. \let\ptexgtr=>
  71. \let\ptexhat=^
  72. \let\ptexi=\i
  73. \let\ptexindent=\indent
  74. \let\ptexinsert=\insert
  75. \let\ptexlbrace=\{
  76. \let\ptexless=<
  77. \let\ptexnewwrite\newwrite
  78. \let\ptexnoindent=\noindent
  79. \let\ptexplus=+
  80. \let\ptexrbrace=\}
  81. \let\ptexslash=\/
  82. \let\ptexstar=\*
  83. \let\ptext=\t
  84. % If this character appears in an error message or help string, it
  85. % starts a new line in the output.
  86. \newlinechar = `^^J
  87. % Use TeX 3.0's \inputlineno to get the line number, for better error
  88. % messages, but if we're using an old version of TeX, don't do anything.
  89. \ifx\inputlineno\thisisundefined
  90.   \let\linenumber = \empty % Pre-3.0.
  91. \else
  92.   \def\linenumber{l.\the\inputlineno:\space}
  93. % Set up fixed words for English if not already set.
  94. \ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
  95. \ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
  96. \ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
  97. \ifx\putwordin\undefined        \gdef\putwordin{in}\fi
  98. \ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
  99. \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
  100. \ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
  101. \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
  102. \ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
  103. \ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
  104. \ifx\putwordof\undefined        \gdef\putwordof{of}\fi
  105. \ifx\putwordon\undefined        \gdef\putwordon{on}\fi
  106. \ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
  107. \ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
  108. \ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
  109. \ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
  110. \ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
  111. \ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
  112. \ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
  113. \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
  114. \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
  115. \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
  116. \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
  117. \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
  118. \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
  119. \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
  120. \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
  121. \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
  122. \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
  123. \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
  124. \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
  125. \ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
  126. \ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
  127. \ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
  128. \ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
  129. \ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
  130. % In some macros, we cannot use the `\? notation---the left quote is
  131. % in some cases the escape char.
  132. \chardef\backChar  = `\\
  133. \chardef\colonChar = `\:
  134. \chardef\commaChar = `\,
  135. \chardef\dotChar   = `\.
  136. \chardef\exclamChar= `\!
  137. \chardef\plusChar  = `\+
  138. \chardef\questChar = `\?
  139. \chardef\semiChar  = `\;
  140. \chardef\underChar = `\_
  141. \chardef\spaceChar = `\ %
  142. \chardef\spacecat = 10
  143. \def\spaceisspace{\catcode\spaceChar=\spacecat}
  144. {% for help with debugging.
  145.  % example usage: \expandafter\show\activebackslash
  146.  \catcode`\! = 0 \catcode`\\ = \active
  147.  !global!def!activebackslash{\}
  148. % Ignore a token.
  149. \def\gobble#1{}
  150. % The following is used inside several \edef's.
  151. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
  152. % Hyphenation fixes.
  153. \hyphenation{
  154.   Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
  155.   ap-pen-dix bit-map bit-maps
  156.   data-base data-bases eshell fall-ing half-way long-est man-u-script
  157.   man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
  158.   par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
  159.   spell-ing spell-ings
  160.   stand-alone strong-est time-stamp time-stamps which-ever white-space
  161.   wide-spread wrap-around
  162. % Margin to add to right of even pages, to left of odd pages.
  163. \newdimen\bindingoffset
  164. \newdimen\normaloffset
  165. \newdimen\pagewidth \newdimen\pageheight
  166. % For a final copy, take out the rectangles
  167. % that mark overfull boxes (in case you have decided
  168. % that the text looks ok even though it passes the margin).
  169. \def\finalout{\overfullrule=0pt}
  170. % @| inserts a changebar to the left of the current line.  It should
  171. % surround any changed text.  This approach does *not* work if the
  172. % change spans more than two lines of output.  To handle that, we would
  173. % have adopt a much more difficult approach (putting marks into the main
  174. % vertical list for the beginning and end of each change).
  175. \def\|{%
  176.   % \vadjust can only be used in horizontal mode.
  177.   \leavevmode
  178.   % Append this vertical mode material after the current line in the output.
  179.   \vadjust{%
  180.     % We want to insert a rule with the height and depth of the current
  181.     % leading; that is exactly what \strutbox is supposed to record.
  182.     \vskip-\baselineskip
  183.     %
  184.     % \vadjust-items are inserted at the left edge of the type.  So
  185.     % the \llap here moves out into the left-hand margin.
  186.     \llap{%
  187.       %
  188.       % For a thicker or thinner bar, change the `1pt'.
  189.       \vrule height\baselineskip width1pt
  190.       %
  191.       % This is the space between the bar and the text.
  192.       \hskip 12pt
  193.     }%
  194. % Sometimes it is convenient to have everything in the transcript file
  195. % and nothing on the terminal.  We don't just call \tracingall here,
  196. % since that produces some useless output on the terminal.  We also make
  197. % some effort to order the tracing commands to reduce output in the log
  198. % file; cf. trace.sty in LaTeX.
  199. \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
  200. \def\loggingall{%
  201.   \tracingstats2
  202.   \tracingpages1
  203.   \tracinglostchars2  % 2 gives us more in etex
  204.   \tracingparagraphs1
  205.   \tracingoutput1
  206.   \tracingmacros2
  207.   \tracingrestores1
  208.   \showboxbreadth\maxdimen \showboxdepth\maxdimen
  209.   \ifx\eTeXversion\undefined\else % etex gives us more logging
  210.     \tracingscantokens1
  211.     \tracingifs1
  212.     \tracinggroups1
  213.     \tracingnesting2
  214.     \tracingassigns1
  215.   \fi
  216.   \tracingcommands3  % 3 gives us more in etex
  217.   \errorcontextlines16
  218. % add check for \lastpenalty to plain's definitions.  If the last thing
  219. % we did was a \nobreak, we don't want to insert more space.
  220. \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
  221.   \removelastskip\penalty-50\smallskip\fi\fi}
  222. \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
  223.   \removelastskip\penalty-100\medskip\fi\fi}
  224. \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
  225.   \removelastskip\penalty-200\bigskip\fi\fi}
  226. % For @cropmarks command.
  227. % Do @cropmarks to get crop marks.
  228. \newif\ifcropmarks
  229. \let\cropmarks = \cropmarkstrue
  230. % Dimensions to add cropmarks at corners.
  231. % Added by P. A. MacKay, 12 Nov. 1986
  232. \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
  233. \newdimen\cornerlong  \cornerlong=1pc
  234. \newdimen\cornerthick \cornerthick=.3pt
  235. \newdimen\topandbottommargin \topandbottommargin=.75in
  236. % Main output routine.
  237. \chardef\PAGE = 255
  238. \output = {\onepageout{\pagecontents\PAGE}}
  239. \newbox\headlinebox
  240. \newbox\footlinebox
  241. % \onepageout takes a vbox as an argument.  Note that \pagecontents
  242. % does insertions, but you have to call it yourself.
  243. \def\onepageout#1{%
  244.   \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
  245.   \ifodd\pageno  \advance\hoffset by \bindingoffset
  246.   \else \advance\hoffset by -\bindingoffset\fi
  247.   % Do this outside of the \shipout so @code etc. will be expanded in
  248.   % the headline as they should be, not taken literally (outputting ''code).
  249.   \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
  250.   \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
  251.     % Have to do this stuff outside the \shipout because we want it to
  252.     % take effect in \write's, yet the group defined by the \vbox ends
  253.     % before the \shipout runs.
  254.     %
  255.     \indexdummies         % don't expand commands in the output.
  256.     \shipout\vbox{%
  257.       % Do this early so pdf references go to the beginning of the page.
  258.       \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
  259.       %
  260.       \ifcropmarks \vbox to \outervsize\bgroup
  261.         \hsize = \outerhsize
  262.         \vskip-\topandbottommargin
  263.         \vtop to0pt{%
  264.           \line{\ewtop\hfil\ewtop}%
  265.           \nointerlineskip
  266.           \line{%
  267.             \vbox{\moveleft\cornerthick\nstop}%
  268.             \hfill
  269.             \vbox{\moveright\cornerthick\nstop}%
  270.           }%
  271.           \vss}%
  272.         \vskip\topandbottommargin
  273.         \line\bgroup
  274.           \hfil % center the page within the outer (page) hsize.
  275.           \ifodd\pageno\hskip\bindingoffset\fi
  276.           \vbox\bgroup
  277.       \fi
  278.       %
  279.       \unvbox\headlinebox
  280.       \pagebody{#1}%
  281.       \ifdim\ht\footlinebox > 0pt
  282.         % Only leave this space if the footline is nonempty.
  283.         % (We lessened \vsize for it in \oddfootingxxx.)
  284.         % The \baselineskip=24pt in plain's \makefootline has no effect.
  285.         \vskip 2\baselineskip
  286.         \unvbox\footlinebox
  287.       \fi
  288.       %
  289.       \ifcropmarks
  290.           \egroup % end of \vbox\bgroup
  291.         \hfil\egroup % end of (centering) \line\bgroup
  292.         \vskip\topandbottommargin plus1fill minus1fill
  293.         \boxmaxdepth = \cornerthick
  294.         \vbox to0pt{\vss
  295.           \line{%
  296.             \vbox{\moveleft\cornerthick\nsbot}%
  297.             \hfill
  298.             \vbox{\moveright\cornerthick\nsbot}%
  299.           }%
  300.           \nointerlineskip
  301.           \line{\ewbot\hfil\ewbot}%
  302.         }%
  303.       \egroup % \vbox from first cropmarks clause
  304.       \fi
  305.     }% end of \shipout\vbox
  306.   }% end of group with \indexdummies
  307.   \advancepageno
  308.   \ifnum\outputpenalty>-20000 \else\dosupereject\fi
  309. \newinsert\margin \dimen\margin=\maxdimen
  310. \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
  311. {\catcode`\@ =11
  312. \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
  313. % marginal hacks, juha@viisa.uucp (Juha Takala)
  314. \ifvoid\margin\else % marginal info is present
  315.   \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
  316. \dimen@=\dp#1 \unvbox#1
  317. \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
  318. \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
  319. % Here are the rules for the cropmarks.  Note that they are
  320. % offset so that the space between them is truly \outerhsize or \outervsize
  321. % (P. A. MacKay, 12 November, 1986)
  322. \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
  323. \def\nstop{\vbox
  324.   {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
  325. \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
  326. \def\nsbot{\vbox
  327.   {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
  328. % Parse an argument, then pass it to #1.  The argument is the rest of
  329. % the input line (except we remove a trailing comment).  #1 should be a
  330. % macro which expects an ordinary undelimited TeX argument.
  331. \def\parsearg{\parseargusing{}}
  332. \def\parseargusing#1#2{%
  333.   \def\next{#2}%
  334.   \begingroup
  335.     \obeylines
  336.     \spaceisspace
  337.     #1%
  338.     \parseargline\empty% Insert the \empty token, see \finishparsearg below.
  339. {\obeylines %
  340.   \gdef\parseargline#1^^M{%
  341.     \endgroup % End of the group started in \parsearg.
  342.     \argremovecomment #1\comment\ArgTerm%
  343. % First remove any @comment, then any @c comment.
  344. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
  345. \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
  346. % Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
  347. % \argremovec might leave us with trailing space, e.g.,
  348. %    @end itemize  @c foo
  349. % This space token undergoes the same procedure and is eventually removed
  350. % by \finishparsearg.
  351. \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
  352. \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
  353. \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
  354.   \def\temp{#3}%
  355.   \ifx\temp\empty
  356.     % We cannot use \next here, as it holds the macro to run;
  357.     % thus we reuse \temp.
  358.     \let\temp\finishparsearg
  359.   \else
  360.     \let\temp\argcheckspaces
  361.   \fi
  362.   % Put the space token in:
  363.   \temp#1 #3\ArgTerm
  364. % If a _delimited_ argument is enclosed in braces, they get stripped; so
  365. % to get _exactly_ the rest of the line, we had to prevent such situation.
  366. % We prepended an \empty token at the very beginning and we expand it now,
  367. % just before passing the control to \next.
  368. % (Similarily, we have to think about #3 of \argcheckspacesY above: it is
  369. % either the null string, or it ends with \^^M---thus there is no danger
  370. % that a pair of braces would be stripped.
  371. % But first, we have to remove the trailing space token.
  372. \def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}}
  373. % \parseargdef\foo{...}
  374. %    is roughly equivalent to
  375. % \def\foo{\parsearg\Xfoo}
  376. % \def\Xfoo#1{...}
  377. % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
  378. % favourite TeX trick.  --kasal, 16nov03
  379. \def\parseargdef#1{%
  380.   \expandafter \doparseargdef \csname\string#1\endcsname #1%
  381. \def\doparseargdef#1#2{%
  382.   \def#2{\parsearg#1}%
  383.   \def#1##1%
  384. % Several utility definitions with active space:
  385.   \obeyspaces
  386.   \gdef\obeyedspace{ }
  387.   % Make each space character in the input produce a normal interword
  388.   % space in the output.  Don't allow a line break at this space, as this
  389.   % is used only in environments like @example, where each line of input
  390.   % should produce a line of output anyway.
  391.   \gdef\sepspaces{\obeyspaces\let =\tie}
  392.   % If an index command is used in an @example environment, any spaces
  393.   % therein should become regular spaces in the raw index file, not the
  394.   % expansion of \tie (\leavevmode \penalty \@M \ ).
  395.   \gdef\unsepspaces{\let =\space}
  396. \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
  397. % Define the framework for environments in texinfo.tex.  It's used like this:
  398. %   \envdef\foo{...}
  399. %   \def\Efoo{...}
  400. % It's the responsibility of \envdef to insert \begingroup before the
  401. % actual body; @end closes the group after calling \Efoo.  \envdef also
  402. % defines \thisenv, so the current environment is known; @end checks
  403. % whether the environment name matches.  The \checkenv macro can also be
  404. % used to check whether the current environment is the one expected.
  405. % Non-false conditionals (@iftex, @ifset) don't fit into this, so they
  406. % are not treated as enviroments; they don't open a group.  (The
  407. % implementation of @end takes care not to call \endgroup in this
  408. % special case.)
  409. % At runtime, environments start with this:
  410. \def\startenvironment#1{\begingroup\def\thisenv{#1}}
  411. % initialize
  412. \let\thisenv\empty
  413. % ... but they get defined via ``\envdef\foo{...}'':
  414. \long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
  415. \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
  416. % Check whether we're in the right environment:
  417. \def\checkenv#1{%
  418.   \def\temp{#1}%
  419.   \ifx\thisenv\temp
  420.   \else
  421.     \badenverr
  422.   \fi
  423. % Evironment mismatch, #1 expected:
  424. \def\badenverr{%
  425.   \errhelp = \EMsimple
  426.   \errmessage{This command can appear only \inenvironment\temp,
  427.     not \inenvironment\thisenv}%
  428. \def\inenvironment#1{%
  429.   \ifx#1\empty
  430.     out of any environment%
  431.   \else
  432.     in environment \expandafter\string#1%
  433.   \fi
  434. % @end foo executes the definition of \Efoo.
  435. % But first, it executes a specialized version of \checkenv
  436. \parseargdef\end{%
  437.   \if 1\csname iscond.#1\endcsname
  438.   \else
  439.     % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
  440.     \expandafter\checkenv\csname#1\endcsname
  441.     \csname E#1\endcsname
  442.     \endgroup
  443.   \fi
  444. \newhelp\EMsimple{Press RETURN to continue.}
  445. %% Simple single-character @ commands
  446. % @@ prints an @
  447. % Kludge this until the fonts are right (grr).
  448. \def\@{{\tt\char64}}
  449. % This is turned off because it was never documented
  450. % and you can use @w{...} around a quote to suppress ligatures.
  451. %% Define @` and @' to be the same as ` and '
  452. %% but suppressing ligatures.
  453. %\def\`{{`}}
  454. %\def\'{{'}}
  455. % Used to generate quoted braces.
  456. \def\mylbrace {{\tt\char123}}
  457. \def\myrbrace {{\tt\char125}}
  458. \let\{=\mylbrace
  459. \let\}=\myrbrace
  460. \begingroup
  461.   % Definitions to produce \{ and \} commands for indices,
  462.   % and @{ and @} for the aux/toc files.
  463.   \catcode`\{ = \other \catcode`\} = \other
  464.   \catcode`\[ = 1 \catcode`\] = 2
  465.   \catcode`\! = 0 \catcode`\\ = \other
  466.   !gdef!lbracecmd[\{]%
  467.   !gdef!rbracecmd[\}]%
  468.   !gdef!lbraceatcmd[@{]%
  469.   !gdef!rbraceatcmd[@}]%
  470. !endgroup
  471. % @comma{} to avoid , parsing problems.
  472. \let\comma = ,
  473. % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
  474. % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
  475. \let\, = \c
  476. \let\dotaccent = \.
  477. \def\ringaccent#1{{\accent23 #1}}
  478. \let\tieaccent = \t
  479. \let\ubaraccent = \b
  480. \let\udotaccent = \d
  481. % Other special characters: @questiondown @exclamdown @ordf @ordm
  482. % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
  483. \def\questiondown{?`}
  484. \def\exclamdown{!`}
  485. \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
  486. \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
  487. % Dotless i and dotless j, used for accents.
  488. \def\imacro{i}
  489. \def\jmacro{j}
  490. \def\dotless#1{%
  491.   \def\temp{#1}%
  492.   \ifx\temp\imacro \ptexi
  493.   \else\ifx\temp\jmacro \j
  494.   \else \errmessage{@dotless can be used only with i or j}%
  495.   \fi\fi
  496. % The \TeX{} logo, as in plain, but resetting the spacing so that a
  497. % period following counts as ending a sentence.  (Idea found in latex.)
  498. \edef\TeX{\TeX \spacefactor=1000 }
  499. % @LaTeX{} logo.  Not quite the same results as the definition in
  500. % latex.ltx, since we use a different font for the raised A; it's most
  501. % convenient for us to use an explicitly smaller font, rather than using
  502. % the \scriptstyle font (since we don't reset \scriptstyle and
  503. % \scriptscriptstyle).
  504. \def\LaTeX{%
  505.   L\kern-.36em
  506.   {\setbox0=\hbox{T}%
  507.    \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
  508.   \kern-.15em
  509.   \TeX
  510. % Be sure we're in horizontal mode when doing a tie, since we make space
  511. % equivalent to this in @example-like environments. Otherwise, a space
  512. % at the beginning of a line will start with \penalty -- and
  513. % since \penalty is valid in vertical mode, we'd end up putting the
  514. % penalty on the vertical list instead of in the new paragraph.
  515. {\catcode`@ = 11
  516.  % Avoid using \@M directly, because that causes trouble
  517.  % if the definition is written into an index file.
  518.  \global\let\tiepenalty = \@M
  519.  \gdef\tie{\leavevmode\penalty\tiepenalty\ }
  520. % @: forces normal size whitespace following.
  521. \def\:{\spacefactor=1000 }
  522. % @* forces a line break.
  523. \def\*{\hfil\break\hbox{}\ignorespaces}
  524. % @/ allows a line break.
  525. \let\/=\allowbreak
  526. % @. is an end-of-sentence period.
  527. \def\.{.\spacefactor=\endofsentencespacefactor\space}
  528. % @! is an end-of-sentence bang.
  529. \def\!{!\spacefactor=\endofsentencespacefactor\space}
  530. % @? is an end-of-sentence query.
  531. \def\?{?\spacefactor=\endofsentencespacefactor\space}
  532. % @frenchspacing on|off  says whether to put extra space after punctuation.
  533. \def\onword{on}
  534. \def\offword{off}
  535. \parseargdef\frenchspacing{%
  536.   \def\temp{#1}%
  537.   \ifx\temp\onword \plainfrenchspacing
  538.   \else\ifx\temp\offword \plainnonfrenchspacing
  539.   \else
  540.     \errhelp = \EMsimple
  541.     \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
  542.   \fi\fi
  543. % @w prevents a word break.  Without the \leavevmode, @w at the
  544. % beginning of a paragraph, when TeX is still in vertical mode, would
  545. % produce a whole line of output instead of starting the paragraph.
  546. \def\w#1{\leavevmode\hbox{#1}}
  547. % @group ... @end group forces ... to be all on one page, by enclosing
  548. % it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
  549. % to keep its height that of a normal line.  According to the rules for
  550. % \topskip (p.114 of the TeXbook), the glue inserted is
  551. % max (\topskip - \ht (first item), 0).  If that height is large,
  552. % therefore, no glue is inserted, and the space between the headline and
  553. % the text is small, which looks bad.
  554. % Another complication is that the group might be very large.  This can
  555. % cause the glue on the previous page to be unduly stretched, because it
  556. % does not have much material.  In this case, it's better to add an
  557. % explicit \vfill so that the extra space is at the bottom.  The
  558. % threshold for doing this is if the group is more than \vfilllimit
  559. % percent of a page (\vfilllimit can be changed inside of @tex).
  560. \newbox\groupbox
  561. \def\vfilllimit{0.7}
  562. \envdef\group{%
  563.   \ifnum\catcode`\^^M=\active \else
  564.     \errhelp = \groupinvalidhelp
  565.     \errmessage{@group invalid in context where filling is enabled}%
  566.   \fi
  567.   \startsavinginserts
  568.   \setbox\groupbox = \vtop\bgroup
  569.     % Do @comment since we are called inside an environment such as
  570.     % @example, where each end-of-line in the input causes an
  571.     % end-of-line in the output.  We don't want the end-of-line after
  572.     % the `@group' to put extra space in the output.  Since @group
  573.     % should appear on a line by itself (according to the Texinfo
  574.     % manual), we don't worry about eating any user text.
  575.     \comment
  576. % The \vtop produces a box with normal height and large depth; thus, TeX puts
  577. % \baselineskip glue before it, and (when the next line of text is done)
  578. % \lineskip glue after it.  Thus, space below is not quite equal to space
  579. % above.  But it's pretty close.
  580. \def\Egroup{%
  581.     % To get correct interline space between the last line of the group
  582.     % and the first line afterwards, we have to propagate \prevdepth.
  583.     \endgraf % Not \par, as it may have been set to \lisppar.
  584.     \global\dimen1 = \prevdepth
  585.   \egroup           % End the \vtop.
  586.   % \dimen0 is the vertical size of the group's box.
  587.   \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
  588.   % \dimen2 is how much space is left on the page (more or less).
  589.   \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
  590.   % if the group doesn't fit on the current page, and it's a big big
  591.   % group, force a page break.
  592.   \ifdim \dimen0 > \dimen2
  593.     \ifdim \pagetotal < \vfilllimit\pageheight
  594.       \page
  595.     \fi
  596.   \fi
  597.   \box\groupbox
  598.   \prevdepth = \dimen1
  599.   \checkinserts
  600. % TeX puts in an \escapechar (i.e., `@') at the beginning of the help
  601. % message, so this ends up printing `@group can only ...'.
  602. \newhelp\groupinvalidhelp{%
  603. group can only be used in environments such as @example,^^J%
  604. where each line of input produces a line of output.}
  605. % @need space-in-mils
  606. % forces a page break if there is not space-in-mils remaining.
  607. \newdimen\mil  \mil=0.001in
  608. % Old definition--didn't work.
  609. %\parseargdef\need{\par %
  610. %% This method tries to make TeX break the page naturally
  611. %% if the depth of the box does not fit.
  612. %{\baselineskip=0pt%
  613. %\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
  614. %\prevdepth=-1000pt
  615. \parseargdef\need{%
  616.   % Ensure vertical mode, so we don't make a big box in the middle of a
  617.   % paragraph.
  618.   \par
  619.   % If the @need value is less than one line space, it's useless.
  620.   \dimen0 = #1\mil
  621.   \dimen2 = \ht\strutbox
  622.   \advance\dimen2 by \dp\strutbox
  623.   \ifdim\dimen0 > \dimen2
  624.     %
  625.     % Do a \strut just to make the height of this box be normal, so the
  626.     % normal leading is inserted relative to the preceding line.
  627.     % And a page break here is fine.
  628.     \vtop to #1\mil{\strut\vfil}%
  629.     %
  630.     % TeX does not even consider page breaks if a penalty added to the
  631.     % main vertical list is 10000 or more.  But in order to see if the
  632.     % empty box we just added fits on the page, we must make it consider
  633.     % page breaks.  On the other hand, we don't want to actually break the
  634.     % page after the empty box.  So we use a penalty of 9999.
  635.     %
  636.     % There is an extremely small chance that TeX will actually break the
  637.     % page at this \penalty, if there are no other feasible breakpoints in
  638.     % sight.  (If the user is using lots of big @group commands, which
  639.     % almost-but-not-quite fill up a page, TeX will have a hard time doing
  640.     % good page breaking, for example.)  However, I could not construct an
  641.     % example where a page broke at this \penalty; if it happens in a real
  642.     % document, then we can reconsider our strategy.
  643.     \penalty9999
  644.     %
  645.     % Back up by the size of the box, whether we did a page break or not.
  646.     \kern -#1\mil
  647.     %
  648.     % Do not allow a page break right after this kern.
  649.     \nobreak
  650.   \fi
  651. % @br   forces paragraph break (and is undocumented).
  652. \let\br = \par
  653. % @page forces the start of a new page.
  654. \def\page{\par\vfill\supereject}
  655. % @exdent text....
  656. % outputs text on separate line in roman font, starting at standard page margin
  657. % This records the amount of indent in the innermost environment.
  658. % That's how much \exdent should take out.
  659. \newskip\exdentamount
  660. % This defn is used inside fill environments such as @defun.
  661. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
  662. % This defn is used inside nofill environments such as @example.
  663. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
  664.   \leftline{\hskip\leftskip{\rm#1}}}}
  665. % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
  666. % paragraph.  For more general purposes, use the \margin insertion
  667. % class.  WHICH is `l' or `r'.
  668. \newskip\inmarginspacing \inmarginspacing=1cm
  669. \def\strutdepth{\dp\strutbox}
  670. \def\doinmargin#1#2{\strut\vadjust{%
  671.   \nobreak
  672.   \kern-\strutdepth
  673.   \vtop to \strutdepth{%
  674.     \baselineskip=\strutdepth
  675.     \vss
  676.     % if you have multiple lines of stuff to put here, you'll need to
  677.     % make the vbox yourself of the appropriate size.
  678.     \ifx#1l%
  679.       \llap{\ignorespaces #2\hskip\inmarginspacing}%
  680.     \else
  681.       \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
  682.     \fi
  683.     \null
  684. \def\inleftmargin{\doinmargin l}
  685. \def\inrightmargin{\doinmargin r}
  686. % @inmargin{TEXT [, RIGHT-TEXT]}
  687. % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
  688. % else use TEXT for both).
  689. \def\inmargin#1{\parseinmargin #1,,\finish}
  690. \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
  691.   \setbox0 = \hbox{\ignorespaces #2}%
  692.   \ifdim\wd0 > 0pt
  693.     \def\lefttext{#1}%  have both texts
  694.     \def\righttext{#2}%
  695.   \else
  696.     \def\lefttext{#1}%  have only one text
  697.     \def\righttext{#1}%
  698.   \fi
  699.   \ifodd\pageno
  700.     \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
  701.   \else
  702.     \def\temp{\inleftmargin\lefttext}%
  703.   \fi
  704.   \temp
  705. % @include file    insert text of that file as input.
  706. \def\include{\parseargusing\filenamecatcodes\includezzz}
  707. \def\includezzz#1{%
  708.   \pushthisfilestack
  709.   \def\thisfile{#1}%
  710.     \makevalueexpandable
  711.     \def\temp{\input #1 }%
  712.     \expandafter
  713.   }\temp
  714.   \popthisfilestack
  715. \def\filenamecatcodes{%
  716.   \catcode`\\=\other
  717.   \catcode`~=\other
  718.   \catcode`^=\other
  719.   \catcode`_=\other
  720.   \catcode`|=\other
  721.   \catcode`<=\other
  722.   \catcode`>=\other
  723.   \catcode`+=\other
  724.   \catcode`-=\other
  725. \def\pushthisfilestack{%
  726.   \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
  727. \def\pushthisfilestackX{%
  728.   \expandafter\pushthisfilestackY\thisfile\StackTerm
  729. \def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
  730.   \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
  731. \def\popthisfilestack{\errthisfilestackempty}
  732. \def\errthisfilestackempty{\errmessage{Internal error:
  733.   the stack of filenames is empty.}}
  734. \def\thisfile{}
  735. % @center line
  736. % outputs that line, centered.
  737. \parseargdef\center{%
  738.   \ifhmode
  739.     \let\next\centerH
  740.   \else
  741.     \let\next\centerV
  742.   \fi
  743.   \next{\hfil \ignorespaces#1\unskip \hfil}%
  744. \def\centerH#1{%
  745.     \hfil\break
  746.     \advance\hsize by -\leftskip
  747.     \advance\hsize by -\rightskip
  748.     \line{#1}%
  749.     \break
  750. \def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
  751. % @sp n   outputs n lines of vertical space
  752. \parseargdef\sp{\vskip #1\baselineskip}
  753. % @comment ...line which is ignored...
  754. % @c is the same as @comment
  755. % @ignore ... @end ignore  is another way to write a comment
  756. \def\comment{\begingroup \catcode`\^^M=\other%
  757. \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
  758. \commentxxx}
  759. {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
  760. \let\c=\comment
  761. % @paragraphindent NCHARS
  762. % We'll use ems for NCHARS, close enough.
  763. % NCHARS can also be the word `asis' or `none'.
  764. % We cannot feasibly implement @paragraphindent asis, though.
  765. \def\asisword{asis} % no translation, these are keywords
  766. \def\noneword{none}
  767. \parseargdef\paragraphindent{%
  768.   \def\temp{#1}%
  769.   \ifx\temp\asisword
  770.   \else
  771.     \ifx\temp\noneword
  772.       \defaultparindent = 0pt
  773.     \else
  774.       \defaultparindent = #1em
  775.     \fi
  776.   \fi
  777.   \parindent = \defaultparindent
  778. % @exampleindent NCHARS
  779. % We'll use ems for NCHARS like @paragraphindent.
  780. % It seems @exampleindent asis isn't necessary, but
  781. % I preserve it to make it similar to @paragraphindent.
  782. \parseargdef\exampleindent{%
  783.   \def\temp{#1}%
  784.   \ifx\temp\asisword
  785.   \else
  786.     \ifx\temp\noneword
  787.       \lispnarrowing = 0pt
  788.     \else
  789.       \lispnarrowing = #1em
  790.     \fi
  791.   \fi
  792. % @firstparagraphindent WORD
  793. % If WORD is `none', then suppress indentation of the first paragraph
  794. % after a section heading.  If WORD is `insert', then do indent at such
  795. % paragraphs.
  796. % The paragraph indentation is suppressed or not by calling
  797. % \suppressfirstparagraphindent, which the sectioning commands do.
  798. % We switch the definition of this back and forth according to WORD.
  799. % By default, we suppress indentation.
  800. \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
  801. \def\insertword{insert}
  802. \parseargdef\firstparagraphindent{%
  803.   \def\temp{#1}%
  804.   \ifx\temp\noneword
  805.     \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
  806.   \else\ifx\temp\insertword
  807.     \let\suppressfirstparagraphindent = \relax
  808.   \else
  809.     \errhelp = \EMsimple
  810.     \errmessage{Unknown @firstparagraphindent option `\temp'}%
  811.   \fi\fi
  812. % Here is how we actually suppress indentation.  Redefine \everypar to
  813. % \kern backwards by \parindent, and then reset itself to empty.
  814. % We also make \indent itself not actually do anything until the next
  815. % paragraph.
  816. \gdef\dosuppressfirstparagraphindent{%
  817.   \gdef\indent{%
  818.     \restorefirstparagraphindent
  819.     \indent
  820.   \gdef\noindent{%
  821.     \restorefirstparagraphindent
  822.     \noindent
  823.   \global\everypar = {%
  824.     \kern -\parindent
  825.     \restorefirstparagraphindent
  826. \gdef\restorefirstparagraphindent{%
  827.   \global \let \indent = \ptexindent
  828.   \global \let \noindent = \ptexnoindent
  829.   \global \everypar = {}%
  830. % @asis just yields its argument.  Used with @table, for example.
  831. \def\asis#1{#1}
  832. % @math outputs its argument in math mode.
  833. % One complication: _ usually means subscripts, but it could also mean
  834. % an actual _ character, as in @math{@var{some_variable} + 1}.  So make
  835. % _ active, and distinguish by seeing if the current family is \slfam,
  836. % which is what @var uses.
  837.   \catcode\underChar = \active
  838.   \gdef\mathunderscore{%
  839.     \catcode\underChar=\active
  840.     \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
  841. % Another complication: we want \\ (and @\) to output a \ character.
  842. % FYI, plain.tex uses \\ as a temporary control sequence (why?), but
  843. % this is not advertised and we don't care.  Texinfo does not
  844. % otherwise define @\.
  845. % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
  846. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
  847. \def\math{%
  848.   \tex
  849.   \mathunderscore
  850.   \let\\ = \mathbackslash
  851.   \mathactive
  852.   $\finishmath
  853. \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
  854. % Some active characters (such as <) are spaced differently in math.
  855. % We have to reset their definitions in case the @math was an argument
  856. % to a command which sets the catcodes (such as @item or @section).
  857.   \catcode`^ = \active
  858.   \catcode`< = \active
  859.   \catcode`> = \active
  860.   \catcode`+ = \active
  861.   \gdef\mathactive{%
  862.     \let^ = \ptexhat
  863.     \let< = \ptexless
  864.     \let> = \ptexgtr
  865.     \let+ = \ptexplus
  866. % @bullet and @minus need the same treatment as @math, just above.
  867. \def\bullet{$\ptexbullet$}
  868. \def\minus{$-$}
  869. % @dots{} outputs an ellipsis using the current font.
  870. % We do .5em per period so that it has the same spacing in a typewriter
  871. % font as three actual period characters.
  872. \def\dots{%
  873.   \leavevmode
  874.   \hbox to 1.5em{%
  875.     \hskip 0pt plus 0.25fil
  876.     .\hfil.\hfil.%
  877.     \hskip 0pt plus 0.5fil
  878. % @enddots{} is an end-of-sentence ellipsis.
  879. \def\enddots{%
  880.   \dots
  881.   \spacefactor=\endofsentencespacefactor
  882. % @comma{} is so commas can be inserted into text without messing up
  883. % Texinfo's parsing.
  884. \let\comma = ,
  885. % @refill is a no-op.
  886. \let\refill=\relax
  887. % If working on a large document in chapters, it is convenient to
  888. % be able to disable indexing, cross-referencing, and contents, for test runs.
  889. % This is done with @novalidate (before @setfilename).
  890. \newif\iflinks \linkstrue % by default we want the aux files.
  891. \let\novalidate = \linksfalse
  892. % @setfilename is done at the beginning of every texinfo file.
  893. % So open here the files we need to have open while reading the input.
  894. % This makes it possible to make a .fmt file for texinfo.
  895. \def\setfilename{%
  896.    \fixbackslash  % Turn off hack to swallow `\input texinfo'.
  897.    \iflinks
  898.      \tryauxfile
  899.      % Open the new aux file.  TeX will close it automatically at exit.
  900.      \immediate\openout\auxfile=\jobname.aux
  901.    \fi % \openindices needs to do some work in any case.
  902.    \openindices
  903.    \let\setfilename=\comment % Ignore extra @setfilename cmds.
  904.    % If texinfo.cnf is present on the system, read it.
  905.    % Useful for site-wide @afourpaper, etc.
  906.    \openin 1 texinfo.cnf
  907.    \ifeof 1 \else \input texinfo.cnf \fi
  908.    \closein 1
  909.    \comment % Ignore the actual filename.
  910. % Called from \setfilename.
  911. \def\openindices{%
  912.   \newindex{cp}%
  913.   \newcodeindex{fn}%
  914.   \newcodeindex{vr}%
  915.   \newcodeindex{tp}%
  916.   \newcodeindex{ky}%
  917.   \newcodeindex{pg}%
  918. % @bye.
  919. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
  920. \message{pdf,}
  921. % adobe `portable' document format
  922. \newcount\tempnum
  923. \newcount\lnkcount
  924. \newtoks\filename
  925. \newcount\filenamelength
  926. \newcount\pgn
  927. \newtoks\toksA
  928. \newtoks\toksB
  929. \newtoks\toksC
  930. \newtoks\toksD
  931. \newbox\boxA
  932. \newcount\countA
  933. \newif\ifpdf
  934. \newif\ifpdfmakepagedest
  935. % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
  936. % can be set).  So we test for \relax and 0 as well as \undefined,
  937. % borrowed from ifpdf.sty.
  938. \ifx\pdfoutput\undefined
  939. \else
  940.   \ifx\pdfoutput\relax
  941.   \else
  942.     \ifcase\pdfoutput
  943.     \else
  944.       \pdftrue
  945.     \fi
  946.   \fi
  947. % PDF uses PostScript string constants for the names of xref targets, to
  948. % for display in the outlines, and in other places.  Thus, we have to
  949. % double any backslashes.  Otherwise, a name like "\node" will be
  950. % interpreted as a newline (\n), followed by o, d, e.  Not good.
  951. % http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
  952. % (and related messages, the final outcome is that it is up to the TeX
  953. % user to double the backslashes and otherwise make the string valid, so
  954. % that's we do).
  955. % double active backslashes.
  956. {\catcode`\@=0 \catcode`\\=\active
  957.  @gdef@activebackslash{@catcode`@\=@active @otherbackslash}
  958.  @gdef@activebackslashdouble{%
  959.    @catcode@backChar=@active
  960.    @let\=@doublebackslash}
  961. % To handle parens, we must adopt a different approach, since parens are
  962. % not active characters.  hyperref.dtx (which has the same problem as
  963. % us) handles it with this amazing macro to replace tokens.  I've
  964. % tinkered with it a little for texinfo, but it's definitely from there.
  965. % #1 is the tokens to replace.
  966. % #2 is the replacement.
  967. % #3 is the control sequence with the string.
  968. \def\HyPsdSubst#1#2#3{%
  969.   \def\HyPsdReplace##1#1##2\END{%
  970.     ##1%
  971.     \ifx\\##2\\%
  972.     \else
  973.       #2%
  974.       \HyReturnAfterFi{%
  975.         \HyPsdReplace##2\END
  976.       }%
  977.     \fi
  978.   \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
  979. \long\def\HyReturnAfterFi#1\fi{\fi#1}
  980. % #1 is a control sequence in which to do the replacements.
  981. \def\backslashparens#1{%
  982.   \xdef#1{#1}% redefine it as its expansion; the definition is simply
  983.              % \lastnode when called from \setref -> \pdfmkdest.
  984.   \HyPsdSubst{(}{\backslashlparen}{#1}%
  985.   \HyPsdSubst{)}{\backslashrparen}{#1}%
  986. {\catcode\exclamChar = 0 \catcode\backChar = \other
  987.  !gdef!backslashlparen{\(}%
  988.  !gdef!backslashrparen{\)}%
  989. \ifpdf
  990.   \input pdfcolor
  991.   \pdfcatalog{/PageMode /UseOutlines}%
  992.   \def\dopdfimage#1#2#3{%
  993.     \def\imagewidth{#2}%
  994.     \def\imageheight{#3}%
  995.     % without \immediate, pdftex seg faults when the same image is
  996.     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
  997.     \ifnum\pdftexversion < 14
  998.       \immediate\pdfimage
  999.     \else
  1000.       \immediate\pdfximage
  1001.     \fi
  1002.       \ifx\empty\imagewidth\else width \imagewidth \fi
  1003.       \ifx\empty\imageheight\else height \imageheight \fi
  1004.       \ifnum\pdftexversion<13
  1005.          #1.pdf%
  1006.        \else
  1007.          {#1.pdf}%
  1008.        \fi
  1009.     \ifnum\pdftexversion < 14 \else
  1010.       \pdfrefximage \pdflastximage
  1011.     \fi}
  1012.   \def\pdfmkdest#1{{%
  1013.     % We have to set dummies so commands such as @code, and characters
  1014.     % such as \, aren't expanded when present in a section title.
  1015.     \atdummies
  1016.     \activebackslashdouble
  1017.     \def\pdfdestname{#1}%
  1018.     \backslashparens\pdfdestname
  1019.     \pdfdest name{\pdfdestname} xyz%
  1020.   }}%
  1021.   % used to mark target names; must be expandable.
  1022.   \def\pdfmkpgn#1{#1}%
  1023.   \let\linkcolor = \Blue  % was Cyan, but that seems light?
  1024.   \def\endlink{\Black\pdfendlink}
  1025.   % Adding outlines to PDF; macros for calculating structure of outlines
  1026.   % come from Petr Olsak
  1027.   \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
  1028.     \else \csname#1\endcsname \fi}
  1029.   \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
  1030.     \advance\tempnum by 1
  1031.     \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
  1032.   % #1 is the section text, which is what will be displayed in the
  1033.   % outline by the pdf viewer.  #2 is the pdf expression for the number
  1034.   % of subentries (or empty, for subsubsections).  #3 is the node text,
  1035.   % which might be empty if this toc entry had no corresponding node.
  1036.   % #4 is the page number
  1037.   \def\dopdfoutline#1#2#3#4{%
  1038.     % Generate a link to the node text if that exists; else, use the
  1039.     % page number.  We could generate a destination for the section
  1040.     % text in the case where a section has no node, but it doesn't
  1041.     % seem worth the trouble, since most documents are normally structured.
  1042.     \def\pdfoutlinedest{#3}%
  1043.     \ifx\pdfoutlinedest\empty
  1044.       \def\pdfoutlinedest{#4}%
  1045.     \else
  1046.       % Doubled backslashes in the name.
  1047.       {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
  1048.        \backslashparens\pdfoutlinedest}%
  1049.     \fi
  1050.     %
  1051.     % Also double the backslashes in the display string.
  1052.     {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
  1053.      \backslashparens\pdfoutlinetext}%
  1054.     %
  1055.     \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
  1056.   \def\pdfmakeoutlines{%
  1057.     \begingroup
  1058.       % Thanh's hack / proper braces in bookmarks
  1059.       \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
  1060.       \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
  1061.       %
  1062.       % Read toc silently, to get counts of subentries for \pdfoutline.
  1063.       \def\numchapentry##1##2##3##4{%
  1064.     \def\thischapnum{##2}%
  1065.     \def\thissecnum{0}%
  1066.     \def\thissubsecnum{0}%
  1067.       }%
  1068.       \def\numsecentry##1##2##3##4{%
  1069.     \advancenumber{chap\thischapnum}%
  1070.     \def\thissecnum{##2}%
  1071.     \def\thissubsecnum{0}%
  1072.       }%
  1073.       \def\numsubsecentry##1##2##3##4{%
  1074.     \advancenumber{sec\thissecnum}%
  1075.     \def\thissubsecnum{##2}%
  1076.       }%
  1077.       \def\numsubsubsecentry##1##2##3##4{%
  1078.     \advancenumber{subsec\thissubsecnum}%
  1079.       }%
  1080.       \def\thischapnum{0}%
  1081.       \def\thissecnum{0}%
  1082.       \def\thissubsecnum{0}%
  1083.       %
  1084.       % use \def rather than \let here because we redefine \chapentry et
  1085.       % al. a second time, below.
  1086.       \def\appentry{\numchapentry}%
  1087.       \def\appsecentry{\numsecentry}%
  1088.       \def\appsubsecentry{\numsubsecentry}%
  1089.       \def\appsubsubsecentry{\numsubsubsecentry}%
  1090.       \def\unnchapentry{\numchapentry}%
  1091.       \def\unnsecentry{\numsecentry}%
  1092.       \def\unnsubsecentry{\numsubsecentry}%
  1093.       \def\unnsubsubsecentry{\numsubsubsecentry}%
  1094.       \readdatafile{toc}%
  1095.       %
  1096.       % Read toc second time, this time actually producing the outlines.
  1097.       % The `-' means take the \expnumber as the absolute number of
  1098.       % subentries, which we calculated on our first read of the .toc above.
  1099.       %
  1100.       % We use the node names as the destinations.
  1101.       \def\numchapentry##1##2##3##4{%
  1102.         \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
  1103.       \def\numsecentry##1##2##3##4{%
  1104.         \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
  1105.       \def\numsubsecentry##1##2##3##4{%
  1106.         \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
  1107.       \def\numsubsubsecentry##1##2##3##4{% count is always zero
  1108.         \dopdfoutline{##1}{}{##3}{##4}}%
  1109.       %
  1110.       % PDF outlines are displayed using system fonts, instead of
  1111.       % document fonts.  Therefore we cannot use special characters,
  1112.       % since the encoding is unknown.  For example, the eogonek from
  1113.       % Latin 2 (0xea) gets translated to a | character.  Info from
  1114.       % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
  1115.       %
  1116.       % xx to do this right, we have to translate 8-bit characters to
  1117.       % their "best" equivalent, based on the @documentencoding.  Right
  1118.       % now, I guess we'll just let the pdf reader have its way.
  1119.       \indexnofonts
  1120.       \setupdatafile
  1121.       \activebackslash
  1122.       \input \jobname.toc
  1123.     \endgroup
  1124.   \def\skipspaces#1{\def\PP{#1}\def\D{|}%
  1125.     \ifx\PP\D\let\nextsp\relax
  1126.     \else\let\nextsp\skipspaces
  1127.       \ifx\p\space\else\addtokens{\filename}{\PP}%
  1128.         \advance\filenamelength by 1
  1129.       \fi
  1130.     \fi
  1131.     \nextsp}
  1132.   \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
  1133.   \ifnum\pdftexversion < 14
  1134.     \let \startlink \pdfannotlink
  1135.   \else
  1136.     \let \startlink \pdfstartlink
  1137.   \fi
  1138.   \def\pdfurl#1{%
  1139.     \begingroup
  1140.       \normalturnoffactive\def\@{@}%
  1141.       \makevalueexpandable
  1142.       \leavevmode\Red
  1143.       \startlink attr{/Border [0 0 0]}%
  1144.         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
  1145.     \endgroup}
  1146.   \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
  1147.   \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
  1148.   \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
  1149.   \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
  1150.   \def\maketoks{%
  1151.     \expandafter\poptoks\the\toksA|ENDTOKS|\relax
  1152.     \ifx\first0\adn0
  1153.     \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
  1154.     \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
  1155.     \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
  1156.     \else
  1157.       \ifnum0=\countA\else\makelink\fi
  1158.       \ifx\first.\let\next=\done\else
  1159.         \let\next=\maketoks
  1160.         \addtokens{\toksB}{\the\toksD}
  1161.         \ifx\first,\addtokens{\toksB}{\space}\fi
  1162.       \fi
  1163.     \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
  1164.     \next}
  1165.   \def\makelink{\addtokens{\toksB}%
  1166.     {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
  1167.   \def\pdflink#1{%
  1168.     \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
  1169.     \linkcolor #1\endlink}
  1170.   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
  1171. \else
  1172.   \let\pdfmkdest = \gobble
  1173.   \let\pdfurl = \gobble
  1174.   \let\endlink = \relax
  1175.   \let\linkcolor = \relax
  1176.   \let\pdfmakeoutlines = \relax
  1177. \fi  % \ifx\pdfoutput
  1178. \message{fonts,}
  1179. % Change the current font style to #1, remembering it in \curfontstyle.
  1180. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
  1181. % italics, not bold italics.
  1182. \def\setfontstyle#1{%
  1183.   \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
  1184.   \csname ten#1\endcsname  % change the current font
  1185. % Select #1 fonts with the current style.
  1186. \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
  1187. \def\rm{\fam=0 \setfontstyle{rm}}
  1188. \def\it{\fam=\itfam \setfontstyle{it}}
  1189. \def\sl{\fam=\slfam \setfontstyle{sl}}
  1190. \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
  1191. \def\tt{\fam=\ttfam \setfontstyle{tt}}
  1192. % Texinfo sort of supports the sans serif font style, which plain TeX does not.
  1193. % So we set up a \sf.
  1194. \newfam\sffam
  1195. \def\sf{\fam=\sffam \setfontstyle{sf}}
  1196. \let\li = \sf % Sometimes we call it \li, not \sf.
  1197. % We don't need math for this font style.
  1198. \def\ttsl{\setfontstyle{ttsl}}
  1199. % Default leading.
  1200. \newdimen\textleading  \textleading = 13.2pt
  1201. % Set the baselineskip to #1, and the lineskip and strut size
  1202. % correspondingly.  There is no deep meaning behind these magic numbers
  1203. % used as factors; they just match (closely enough) what Knuth defined.
  1204. \def\lineskipfactor{.08333}
  1205. \def\strutheightpercent{.70833}
  1206. \def\strutdepthpercent {.29167}
  1207. \def\setleading#1{%
  1208.   \normalbaselineskip = #1\relax
  1209.   \normallineskip = \lineskipfactor\normalbaselineskip
  1210.   \normalbaselines
  1211.   \setbox\strutbox =\hbox{%
  1212.     \vrule width0pt height\strutheightpercent\baselineskip
  1213.                     depth \strutdepthpercent \baselineskip
  1214. % Set the font macro #1 to the font named #2, adding on the
  1215. % specified font prefix (normally `cm').
  1216. % #3 is the font's design size, #4 is a scale factor
  1217. \def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
  1218. % Use cm as the default font prefix.
  1219. % To specify the font prefix, you must define \fontprefix
  1220. % before you read in texinfo.tex.
  1221. \ifx\fontprefix\undefined
  1222. \def\fontprefix{cm}
  1223. % Support font families that don't use the same naming scheme as CM.
  1224. \def\rmshape{r}
  1225. \def\rmbshape{bx}               %where the normal face is bold
  1226. \def\bfshape{b}
  1227. \def\bxshape{bx}
  1228. \def\ttshape{tt}
  1229. \def\ttbshape{tt}
  1230. \def\ttslshape{sltt}
  1231. \def\itshape{ti}
  1232. \def\itbshape{bxti}
  1233. \def\slshape{sl}
  1234. \def\slbshape{bxsl}
  1235. \def\sfshape{ss}
  1236. \def\sfbshape{ss}
  1237. \def\scshape{csc}
  1238. \def\scbshape{csc}
  1239. % Text fonts (11.2pt, magstep1).
  1240. \def\textnominalsize{11pt}
  1241. \edef\mainmagstep{\magstephalf}
  1242. \setfont\textrm\rmshape{10}{\mainmagstep}
  1243. \setfont\texttt\ttshape{10}{\mainmagstep}
  1244. \setfont\textbf\bfshape{10}{\mainmagstep}
  1245. \setfont\textit\itshape{10}{\mainmagstep}
  1246. \setfont\textsl\slshape{10}{\mainmagstep}
  1247. \setfont\textsf\sfshape{10}{\mainmagstep}
  1248. \setfont\textsc\scshape{10}{\mainmagstep}
  1249. \setfont\textttsl\ttslshape{10}{\mainmagstep}
  1250. \font\texti=cmmi10 scaled \mainmagstep
  1251. \font\textsy=cmsy10 scaled \mainmagstep
  1252. % A few fonts for @defun names and args.
  1253. \setfont\defbf\bfshape{10}{\magstep1}
  1254. \setfont\deftt\ttshape{10}{\magstep1}
  1255. \setfont\defttsl\ttslshape{10}{\magstep1}
  1256. \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
  1257. % Fonts for indices, footnotes, small examples (9pt).
  1258. \def\smallnominalsize{9pt}
  1259. \setfont\smallrm\rmshape{9}{1000}
  1260. \setfont\smalltt\ttshape{9}{1000}
  1261. \setfont\smallbf\bfshape{10}{900}
  1262. \setfont\smallit\itshape{9}{1000}
  1263. \setfont\smallsl\slshape{9}{1000}
  1264. \setfont\smallsf\sfshape{9}{1000}
  1265. \setfont\smallsc\scshape{10}{900}
  1266. \setfont\smallttsl\ttslshape{10}{900}
  1267. \font\smalli=cmmi9
  1268. \font\smallsy=cmsy9
  1269. % Fonts for small examples (8pt).
  1270. \def\smallernominalsize{8pt}
  1271. \setfont\smallerrm\rmshape{8}{1000}
  1272. \setfont\smallertt\ttshape{8}{1000}
  1273. \setfont\smallerbf\bfshape{10}{800}
  1274. \setfont\smallerit\itshape{8}{1000}
  1275. \setfont\smallersl\slshape{8}{1000}
  1276. \setfont\smallersf\sfshape{8}{1000}
  1277. \setfont\smallersc\scshape{10}{800}
  1278. \setfont\smallerttsl\ttslshape{10}{800}
  1279. \font\smalleri=cmmi8
  1280. \font\smallersy=cmsy8
  1281. % Fonts for title page (20.4pt):
  1282. \def\titlenominalsize{20pt}
  1283. \setfont\titlerm\rmbshape{12}{\magstep3}
  1284. \setfont\titleit\itbshape{10}{\magstep4}
  1285. \setfont\titlesl\slbshape{10}{\magstep4}
  1286. \setfont\titlett\ttbshape{12}{\magstep3}
  1287. \setfont\titlettsl\ttslshape{10}{\magstep4}
  1288. \setfont\titlesf\sfbshape{17}{\magstep1}
  1289. \let\titlebf=\titlerm
  1290. \setfont\titlesc\scbshape{10}{\magstep4}
  1291. \font\titlei=cmmi12 scaled \magstep3
  1292. \font\titlesy=cmsy10 scaled \magstep4
  1293. \def\authorrm{\secrm}
  1294. \def\authortt{\sectt}
  1295. % Chapter (and unnumbered) fonts (17.28pt).
  1296. \def\chapnominalsize{17pt}
  1297. \setfont\chaprm\rmbshape{12}{\magstep2}
  1298. \setfont\chapit\itbshape{10}{\magstep3}
  1299. \setfont\chapsl\slbshape{10}{\magstep3}
  1300. \setfont\chaptt\ttbshape{12}{\magstep2}
  1301. \setfont\chapttsl\ttslshape{10}{\magstep3}
  1302. \setfont\chapsf\sfbshape{17}{1000}
  1303. \let\chapbf=\chaprm
  1304. \setfont\chapsc\scbshape{10}{\magstep3}
  1305. \font\chapi=cmmi12 scaled \magstep2
  1306. \font\chapsy=cmsy10 scaled \magstep3
  1307. % Section fonts (14.4pt).
  1308. \def\secnominalsize{14pt}
  1309. \setfont\secrm\rmbshape{12}{\magstep1}
  1310. \setfont\secit\itbshape{10}{\magstep2}
  1311. \setfont\secsl\slbshape{10}{\magstep2}
  1312. \setfont\sectt\ttbshape{12}{\magstep1}
  1313. \setfont\secttsl\ttslshape{10}{\magstep2}
  1314. \setfont\secsf\sfbshape{12}{\magstep1}
  1315. \let\secbf\secrm
  1316. \setfont\secsc\scbshape{10}{\magstep2}
  1317. \font\seci=cmmi12 scaled \magstep1
  1318. \font\secsy=cmsy10 scaled \magstep2
  1319. % Subsection fonts (13.15pt).
  1320. \def\ssecnominalsize{13pt}
  1321. \setfont\ssecrm\rmbshape{12}{\magstephalf}
  1322. \setfont\ssecit\itbshape{10}{1315}
  1323. \setfont\ssecsl\slbshape{10}{1315}
  1324. \setfont\ssectt\ttbshape{12}{\magstephalf}
  1325. \setfont\ssecttsl\ttslshape{10}{1315}
  1326. \setfont\ssecsf\sfbshape{12}{\magstephalf}
  1327. \let\ssecbf\ssecrm
  1328. \setfont\ssecsc\scbshape{10}{1315}
  1329. \font\sseci=cmmi12 scaled \magstephalf
  1330. \font\ssecsy=cmsy10 scaled 1315
  1331. % Reduced fonts for @acro in text (10pt).
  1332. \def\reducednominalsize{10pt}
  1333. \setfont\reducedrm\rmshape{10}{1000}
  1334. \setfont\reducedtt\ttshape{10}{1000}
  1335. \setfont\reducedbf\bfshape{10}{1000}
  1336. \setfont\reducedit\itshape{10}{1000}
  1337. \setfont\reducedsl\slshape{10}{1000}
  1338. \setfont\reducedsf\sfshape{10}{1000}
  1339. \setfont\reducedsc\scshape{10}{1000}
  1340. \setfont\reducedttsl\ttslshape{10}{1000}
  1341. \font\reducedi=cmmi10
  1342. \font\reducedsy=cmsy10
  1343. % In order for the font changes to affect most math symbols and letters,
  1344. % we have to define the \textfont of the standard families.  Since
  1345. % texinfo doesn't allow for producing subscripts and superscripts except
  1346. % in the main text, we don't bother to reset \scriptfont and
  1347. % \scriptscriptfont (which would also require loading a lot more fonts).
  1348. \def\resetmathfonts{%
  1349.   \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
  1350.   \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
  1351.   \textfont\ttfam=\tentt \textfont\sffam=\tensf
  1352. % The font-changing commands redefine the meanings of \tenSTYLE, instead
  1353. % of just \STYLE.  We do this because \STYLE needs to also set the
  1354. % current \fam for math mode.  Our \STYLE (e.g., \rm) commands hardwire
  1355. % \tenSTYLE to set the current font.
  1356. % Each font-changing command also sets the names \lsize (one size lower)
  1357. % and \lllsize (three sizes lower).  These relative commands are used in
  1358. % the LaTeX logo and acronyms.
  1359. % This all needs generalizing, badly.
  1360. \def\textfonts{%
  1361.   \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
  1362.   \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
  1363.   \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
  1364.   \let\tenttsl=\textttsl
  1365.   \def\curfontsize{text}%
  1366.   \def\lsize{reduced}\def\lllsize{smaller}%
  1367.   \resetmathfonts \setleading{\textleading}}
  1368. \def\titlefonts{%
  1369.   \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
  1370.   \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
  1371.   \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
  1372.   \let\tenttsl=\titlettsl
  1373.   \def\curfontsize{title}%
  1374.   \def\lsize{chap}\def\lllsize{subsec}%
  1375.   \resetmathfonts \setleading{25pt}}
  1376. \def\titlefont#1{{\titlefonts\rm #1}}
  1377. \def\chapfonts{%
  1378.   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
  1379.   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
  1380.   \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
  1381.   \let\tenttsl=\chapttsl
  1382.   \def\curfontsize{chap}%
  1383.   \def\lsize{sec}\def\lllsize{text}%
  1384.   \resetmathfonts \setleading{19pt}}
  1385. \def\secfonts{%
  1386.   \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
  1387.   \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
  1388.   \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
  1389.   \let\tenttsl=\secttsl
  1390.   \def\curfontsize{sec}%
  1391.   \def\lsize{subsec}\def\lllsize{reduced}%
  1392.   \resetmathfonts \setleading{16pt}}
  1393. \def\subsecfonts{%
  1394.   \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
  1395.   \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
  1396.   \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
  1397.   \let\tenttsl=\ssecttsl
  1398.   \def\curfontsize{ssec}%
  1399.   \def\lsize{text}\def\lllsize{small}%
  1400.   \resetmathfonts \setleading{15pt}}
  1401. \let\subsubsecfonts = \subsecfonts
  1402. \def\reducedfonts{%
  1403.   \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
  1404.   \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
  1405.   \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
  1406.   \let\tenttsl=\reducedttsl
  1407.   \def\curfontsize{reduced}%
  1408.   \def\lsize{small}\def\lllsize{smaller}%
  1409.   \resetmathfonts \setleading{10.5pt}}
  1410. \def\smallfonts{%
  1411.   \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
  1412.   \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
  1413.   \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
  1414.   \let\tenttsl=\smallttsl
  1415.   \def\curfontsize{small}%
  1416.   \def\lsize{smaller}\def\lllsize{smaller}%
  1417.   \resetmathfonts \setleading{10.5pt}}
  1418. \def\smallerfonts{%
  1419.   \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
  1420.   \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
  1421.   \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
  1422.   \let\tenttsl=\smallerttsl
  1423.   \def\curfontsize{smaller}%
  1424.   \def\lsize{smaller}\def\lllsize{smaller}%
  1425.   \resetmathfonts \setleading{9.5pt}}
  1426. % Set the fonts to use with the @small... environments.
  1427. \let\smallexamplefonts = \smallfonts
  1428. % About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
  1429. % can fit this many characters:
  1430. %   8.5x11=86   smallbook=72  a4=90  a5=69
  1431. % If we use \scriptfonts (8pt), then we can fit this many characters:
  1432. %   8.5x11=90+  smallbook=80  a4=90+  a5=77
  1433. % For me, subjectively, the few extra characters that fit aren't worth
  1434. % the additional smallness of 8pt.  So I'm making the default 9pt.
  1435. % By the way, for comparison, here's what fits with @example (10pt):
  1436. %   8.5x11=71  smallbook=60  a4=75  a5=58
  1437. % I wish the USA used A4 paper.
  1438. % --karl, 24jan03.
  1439. % Set up the default fonts, so we can use them for creating boxes.
  1440. \textfonts \rm
  1441. % Define these so they can be easily changed for other fonts.
  1442. \def\angleleft{$\langle$}
  1443. \def\angleright{$\rangle$}
  1444. % Count depth in font-changes, for error checks
  1445. \newcount\fontdepth \fontdepth=0
  1446. % Fonts for short table of contents.
  1447. \setfont\shortcontrm\rmshape{12}{1000}
  1448. \setfont\shortcontbf\bfshape{10}{\magstep1}  % no cmb12
  1449. \setfont\shortcontsl\slshape{12}{1000}
  1450. \setfont\shortconttt\ttshape{12}{1000}
  1451. %% Add scribe-like font environments, plus @l for inline lisp (usually sans
  1452. %% serif) and @ii for TeX italic
  1453. % \smartitalic{ARG} outputs arg in italics, followed by an italic correction
  1454. % unless the following character is such as not to need one.
  1455. \def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
  1456.                     \ptexslash\fi\fi\fi}
  1457. \def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
  1458. \def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
  1459. % like \smartslanted except unconditionally uses \ttsl.
  1460. % @var is set to this for defun arguments.
  1461. \def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
  1462. % like \smartslanted except unconditionally use \sl.  We never want
  1463. % ttsl for book titles, do we?
  1464. \def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
  1465. \let\i=\smartitalic
  1466. \let\slanted=\smartslanted
  1467. \let\var=\smartslanted
  1468. \let\dfn=\smartslanted
  1469. \let\emph=\smartitalic
  1470. % @b, explicit bold.
  1471. \def\b#1{{\bf #1}}
  1472. \let\strong=\b
  1473. % @sansserif, explicit sans.
  1474. \def\sansserif#1{{\sf #1}}
  1475. % We can't just use \exhyphenpenalty, because that only has effect at
  1476. % the end of a paragraph.  Restore normal hyphenation at the end of the
  1477. % group within which \nohyphenation is presumably called.
  1478. \def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
  1479. \def\restorehyphenation{\hyphenchar\font = `- }
  1480. % Set sfcode to normal for the chars that usually have another value.
  1481. % Can't use plain's \frenchspacing because it uses the `\x notation, and
  1482. % sometimes \x has an active definition that messes things up.
  1483. \catcode`@=11
  1484.   \def\plainfrenchspacing{%
  1485.     \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
  1486.     \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
  1487.     \def\endofsentencespacefactor{1000}% for @. and friends
  1488.   \def\plainnonfrenchspacing{%
  1489.     \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
  1490.     \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
  1491.     \def\endofsentencespacefactor{3000}% for @. and friends
  1492. \catcode`@=\other
  1493. \def\endofsentencespacefactor{3000}% default
  1494. \def\t#1{%
  1495.   {\tt \rawbackslash \plainfrenchspacing #1}%
  1496.   \null
  1497. \def\samp#1{`\tclose{#1}'\null}
  1498. \setfont\keyrm\rmshape{8}{1000}
  1499. \font\keysy=cmsy9
  1500. \def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
  1501.   \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
  1502.     \vbox{\hrule\kern-0.4pt
  1503.      \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
  1504.     \kern-0.4pt\hrule}%
  1505.   \kern-.06em\raise0.4pt\hbox{\angleright}}}}
  1506. % The old definition, with no lozenge:
  1507. %\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
  1508. \def\ctrl #1{{\tt \rawbackslash \hat}#1}
  1509. % @file, @option are the same as @samp.
  1510. \let\file=\samp
  1511. \let\option=\samp
  1512. % @code is a modification of @t,
  1513. % which makes spaces the same size as normal in the surrounding text.
  1514. \def\tclose#1{%
  1515.     % Change normal interword space to be same as for the current font.
  1516.     \spaceskip = \fontdimen2\font
  1517.     %
  1518.     % Switch to typewriter.
  1519.     \tt
  1520.     %
  1521.     % But `\ ' produces the large typewriter interword space.
  1522.     \def\ {{\spaceskip = 0pt{} }}%
  1523.     %
  1524.     % Turn off hyphenation.
  1525.     \nohyphenation
  1526.     %
  1527.     \rawbackslash
  1528.     \plainfrenchspacing
  1529.     #1%
  1530.   \null
  1531. % We *must* turn on hyphenation at `-' and `_' in @code.
  1532. % Otherwise, it is too hard to avoid overfull hboxes
  1533. % in the Emacs manual, the Library manual, etc.
  1534. % Unfortunately, TeX uses one parameter (\hyphenchar) to control
  1535. % both hyphenation at - and hyphenation within words.
  1536. % We must therefore turn them both off (\tclose does that)
  1537. % and arrange explicitly to hyphenate at a dash.
  1538. %  -- rms.
  1539.   \catcode`\-=\active
  1540.   \catcode`\_=\active
  1541.   \global\def\code{\begingroup
  1542.     \catcode`\-=\active  \catcode`\_=\active
  1543.     \ifallowcodebreaks
  1544.      \let-\codedash
  1545.      \let_\codeunder
  1546.     \else
  1547.      \let-\realdash
  1548.      \let_\realunder
  1549.     \fi
  1550.     \codex
  1551. \def\realdash{-}
  1552. \def\codedash{-\discretionary{}{}{}}
  1553. \def\codeunder{%
  1554.   % this is all so @math{@code{var_name}+1} can work.  In math mode, _
  1555.   % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
  1556.   % will therefore expand the active definition of _, which is us
  1557.   % (inside @code that is), therefore an endless loop.
  1558.   \ifusingtt{\ifmmode
  1559.                \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
  1560.              \else\normalunderscore \fi
  1561.              \discretionary{}{}{}}%
  1562.             {\_}%
  1563. \def\codex #1{\tclose{#1}\endgroup}
  1564. % An additional complication: the above will allow breaks after, e.g.,
  1565. % each of the four underscores in __typeof__.  This is undesirable in
  1566. % some manuals, especially if they don't have long identifiers in
  1567. % general.  @allowcodebreaks provides a way to control this.
  1568. \newif\ifallowcodebreaks  \allowcodebreakstrue
  1569. \def\keywordtrue{true}
  1570. \def\keywordfalse{false}
  1571. \parseargdef\allowcodebreaks{%
  1572.   \def\txiarg{#1}%
  1573.   \ifx\txiarg\keywordtrue
  1574.     \allowcodebreakstrue
  1575.   \else\ifx\txiarg\keywordfalse
  1576.     \allowcodebreaksfalse
  1577.   \else
  1578.     \errhelp = \EMsimple
  1579.     \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
  1580.   \fi\fi
  1581. % @kbd is like @code, except that if the argument is just one @key command,
  1582. % then @kbd has no effect.
  1583. % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
  1584. %   `example' (@kbd uses ttsl only inside of @example and friends),
  1585. %   or `code' (@kbd uses normal tty font always).
  1586. \parseargdef\kbdinputstyle{%
  1587.   \def\txiarg{#1}%
  1588.   \ifx\txiarg\worddistinct
  1589.     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
  1590.   \else\ifx\txiarg\wordexample
  1591.     \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
  1592.   \else\ifx\txiarg\wordcode
  1593.     \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
  1594.   \else
  1595.     \errhelp = \EMsimple
  1596.     \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
  1597.   \fi\fi\fi
  1598. \def\worddistinct{distinct}
  1599. \def\wordexample{example}
  1600. \def\wordcode{code}
  1601. % Default is `distinct.'
  1602. \kbdinputstyle distinct
  1603. \def\xkey{\key}
  1604. \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
  1605. \ifx\one\xkey\ifx\threex\three \key{#2}%
  1606. \else{\tclose{\kbdfont\look}}\fi
  1607. \else{\tclose{\kbdfont\look}}\fi}
  1608. % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
  1609. \let\indicateurl=\code
  1610. \let\env=\code
  1611. \let\command=\code
  1612. % @uref (abbreviation for `urlref') takes an optional (comma-separated)
  1613. % second argument specifying the text to display and an optional third
  1614. % arg as text to display instead of (rather than in addition to) the url
  1615. % itself.  First (mandatory) arg is the url.  Perhaps eventually put in
  1616. % a hypertex \special here.
  1617. \def\uref#1{\douref #1,,,\finish}
  1618. \def\douref#1,#2,#3,#4\finish{\begingroup
  1619.   \unsepspaces
  1620.   \pdfurl{#1}%
  1621.   \setbox0 = \hbox{\ignorespaces #3}%
  1622.   \ifdim\wd0 > 0pt
  1623.     \unhbox0 % third arg given, show only that
  1624.   \else
  1625.     \setbox0 = \hbox{\ignorespaces #2}%
  1626.     \ifdim\wd0 > 0pt
  1627.       \ifpdf
  1628.         \unhbox0             % PDF: 2nd arg given, show only it
  1629.       \else
  1630.         \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
  1631.       \fi
  1632.     \else
  1633.       \code{#1}% only url given, so show it
  1634.     \fi
  1635.   \fi
  1636.   \endlink
  1637. \endgroup}
  1638. % @url synonym for @uref, since that's how everyone uses it.
  1639. \let\url=\uref
  1640. % rms does not like angle brackets --karl, 17may97.
  1641. % So now @email is just like @uref, unless we are pdf.
  1642. %\def\email#1{\angleleft{\tt #1}\angleright}
  1643. \ifpdf
  1644.   \def\email#1{\doemail#1,,\finish}
  1645.   \def\doemail#1,#2,#3\finish{\begingroup
  1646.     \unsepspaces
  1647.     \pdfurl{mailto:#1}%
  1648.     \setbox0 = \hbox{\ignorespaces #2}%
  1649.     \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
  1650.     \endlink
  1651.   \endgroup}
  1652. \else
  1653.   \let\email=\uref
  1654. % Check if we are currently using a typewriter font.  Since all the
  1655. % Computer Modern typewriter fonts have zero interword stretch (and
  1656. % shrink), and it is reasonable to expect all typewriter fonts to have
  1657. % this property, we can check that font parameter.
  1658. \def\ifmonospace{\ifdim\fontdimen3\font=0pt }
  1659. % Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
  1660. % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
  1661. \def\dmn#1{\thinspace #1}
  1662. \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
  1663. % @l was never documented to mean ``switch to the Lisp font'',
  1664. % and it is not used as such in any manual I can find.  We need it for
  1665. % Polish suppressed-l.  --karl, 22sep96.
  1666. %\def\l#1{{\li #1}\null}
  1667. % Explicit font changes: @r, @sc, undocumented @ii.
  1668. \def\r#1{{\rm #1}}              % roman font
  1669. \def\sc#1{{\smallcaps#1}}       % smallcaps font
  1670. \def\ii#1{{\it #1}}             % italic font
  1671. % @acronym for "FBI", "NATO", and the like.
  1672. % We print this one point size smaller, since it's intended for
  1673. % all-uppercase.
  1674. \def\acronym#1{\doacronym #1,,\finish}
  1675. \def\doacronym#1,#2,#3\finish{%
  1676.   {\selectfonts\lsize #1}%
  1677.   \def\temp{#2}%
  1678.   \ifx\temp\empty \else
  1679.     \space ({\unsepspaces \ignorespaces \temp \unskip})%
  1680.   \fi
  1681. % @abbr for "Comput. J." and the like.
  1682. % No font change, but don't do end-of-sentence spacing.
  1683. \def\abbr#1{\doabbr #1,,\finish}
  1684. \def\doabbr#1,#2,#3\finish{%
  1685.   {\plainfrenchspacing #1}%
  1686.   \def\temp{#2}%
  1687.   \ifx\temp\empty \else
  1688.     \space ({\unsepspaces \ignorespaces \temp \unskip})%
  1689.   \fi
  1690. % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
  1691. \def\pounds{{\it\$}}
  1692. % @euro{} comes from a separate font, depending on the current style.
  1693. % We use the free feym* fonts from the eurosym package by Henrik
  1694. % Theiling, which support regular, slanted, bold and bold slanted (and
  1695. % "outlined" (blackboard board, sort of) versions, which we don't need).
  1696. % It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
  1697. % Although only regular is the truly official Euro symbol, we ignore
  1698. % that.  The Euro is designed to be slightly taller than the regular
  1699. % font height.
  1700. % feymr - regular
  1701. % feymo - slanted
  1702. % feybr - bold
  1703. % feybo - bold slanted
  1704. % There is no good (free) typewriter version, to my knowledge.
  1705. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
  1706. % Hmm.
  1707. % Also doesn't work in math.  Do we need to do math with euro symbols?
  1708. % Hope not.
  1709. \def\euro{{\eurofont e}}
  1710. \def\eurofont{%
  1711.   % We set the font at each command, rather than predefining it in
  1712.   % \textfonts and the other font-switching commands, so that
  1713.   % installations which never need the symbol don't have to have the
  1714.   % font installed.
  1715.   % There is only one designed size (nominal 10pt), so we always scale
  1716.   % that to the current nominal size.
  1717.   % By the way, simply using "at 1em" works for cmr10 and the like, but
  1718.   % does not work for cmbx10 and other extended/shrunken fonts.
  1719.   \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
  1720.   \ifx\curfontstyle\bfstylename 
  1721.     % bold:
  1722.     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
  1723.   \else 
  1724.     % regular:
  1725.     \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
  1726.   \fi
  1727.   \thiseurofont
  1728. % @registeredsymbol - R in a circle.  The font for the R should really
  1729. % be smaller yet, but lllsize is the best we can do for now.
  1730. % Adapted from the plain.tex definition of \copyright.
  1731. \def\registeredsymbol{%
  1732.   $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
  1733.                \hfil\crcr\Orb}}%
  1734.     }$%
  1735. % Laurent Siebenmann reports \Orb undefined with:
  1736. %  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
  1737. % so we'll define it if necessary.
  1738. \ifx\Orb\undefined
  1739. \def\Orb{\mathhexbox20D}
  1740. \message{page headings,}
  1741. \newskip\titlepagetopglue \titlepagetopglue = 1.5in
  1742. \newskip\titlepagebottomglue \titlepagebottomglue = 2pc
  1743. % First the title page.  Must do @settitle before @titlepage.
  1744. \newif\ifseenauthor
  1745. \newif\iffinishedtitlepage
  1746. % Do an implicit @contents or @shortcontents after @end titlepage if the
  1747. % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
  1748. \newif\ifsetcontentsaftertitlepage
  1749.  \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
  1750. \newif\ifsetshortcontentsaftertitlepage
  1751.  \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
  1752. \parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
  1753.         \endgroup\page\hbox{}\page}
  1754. \envdef\titlepage{%
  1755.   % Open one extra group, as we want to close it in the middle of \Etitlepage.
  1756.   \begingroup
  1757.     \parindent=0pt \textfonts
  1758.     % Leave some space at the very top of the page.
  1759.     \vglue\titlepagetopglue
  1760.     % No rule at page bottom unless we print one at the top with @title.
  1761.     \finishedtitlepagetrue
  1762.     %
  1763.     % Most title ``pages'' are actually two pages long, with space
  1764.     % at the top of the second.  We don't want the ragged left on the second.
  1765.     \let\oldpage = \page
  1766.     \def\page{%
  1767.       \iffinishedtitlepage\else
  1768.      \finishtitlepage
  1769.       \fi
  1770.       \let\page = \oldpage
  1771.       \page
  1772.       \null
  1773.     }%
  1774. \def\Etitlepage{%
  1775.     \iffinishedtitlepage\else
  1776.     \finishtitlepage
  1777.     \fi
  1778.     % It is important to do the page break before ending the group,
  1779.     % because the headline and footline are only empty inside the group.
  1780.     % If we use the new definition of \page, we always get a blank page
  1781.     % after the title page, which we certainly don't want.
  1782.     \oldpage
  1783.   \endgroup
  1784.   % Need this before the \...aftertitlepage checks so that if they are
  1785.   % in effect the toc pages will come out with page numbers.
  1786.   \HEADINGSon
  1787.   % If they want short, they certainly want long too.
  1788.   \ifsetshortcontentsaftertitlepage
  1789.     \shortcontents
  1790.     \contents
  1791.     \global\let\shortcontents = \relax
  1792.     \global\let\contents = \relax
  1793.   \fi
  1794.   \ifsetcontentsaftertitlepage
  1795.     \contents
  1796.     \global\let\contents = \relax
  1797.     \global\let\shortcontents = \relax
  1798.   \fi
  1799. \def\finishtitlepage{%
  1800.   \vskip4pt \hrule height 2pt width \hsize
  1801.   \vskip\titlepagebottomglue
  1802.   \finishedtitlepagetrue
  1803. %%% Macros to be used within @titlepage:
  1804. \let\subtitlerm=\tenrm
  1805. \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
  1806. \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
  1807.         \let\tt=\authortt}
  1808. \parseargdef\title{%
  1809.   \checkenv\titlepage
  1810.   \leftline{\titlefonts\rm #1}
  1811.   % print a rule at the page bottom also.
  1812.   \finishedtitlepagefalse
  1813.   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
  1814. \parseargdef\subtitle{%
  1815.   \checkenv\titlepage
  1816.   {\subtitlefont \rightline{#1}}%
  1817. % @author should come last, but may come many times.
  1818. % It can also be used inside @quotation.
  1819. \parseargdef\author{%
  1820.   \def\temp{\quotation}%
  1821.   \ifx\thisenv\temp
  1822.     \def\quotationauthor{#1}% printed in \Equotation.
  1823.   \else
  1824.     \checkenv\titlepage
  1825.     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
  1826.     {\authorfont \leftline{#1}}%
  1827.   \fi
  1828. %%% Set up page headings and footings.
  1829. \let\thispage=\folio
  1830. \newtoks\evenheadline    % headline on even pages
  1831. \newtoks\oddheadline     % headline on odd pages
  1832. \newtoks\evenfootline    % footline on even pages
  1833. \newtoks\oddfootline     % footline on odd pages
  1834. % Now make TeX use those variables
  1835. \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
  1836.                             \else \the\evenheadline \fi}}
  1837. \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
  1838.                             \else \the\evenfootline \fi}\HEADINGShook}
  1839. \let\HEADINGShook=\relax
  1840. % Commands to set those variables.
  1841. % For example, this is what  @headings on  does
  1842. % @evenheading @thistitle|@thispage|@thischapter
  1843. % @oddheading @thischapter|@thispage|@thistitle
  1844. % @evenfooting @thisfile||
  1845. % @oddfooting ||@thisfile
  1846. \def\evenheading{\parsearg\evenheadingxxx}
  1847. \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
  1848. \def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
  1849. \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
  1850. \def\oddheading{\parsearg\oddheadingxxx}
  1851. \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
  1852. \def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
  1853. \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
  1854. \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
  1855. \def\evenfooting{\parsearg\evenfootingxxx}
  1856. \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
  1857. \def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
  1858. \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
  1859. \def\oddfooting{\parsearg\oddfootingxxx}
  1860. \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
  1861. \def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
  1862.   \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
  1863.   % Leave some space for the footline.  Hopefully ok to assume
  1864.   % @evenfooting will not be used by itself.
  1865.   \global\advance\pageheight by -\baselineskip
  1866.   \global\advance\vsize by -\baselineskip
  1867. \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
  1868. % @headings double      turns headings on for double-sided printing.
  1869. % @headings single      turns headings on for single-sided printing.
  1870. % @headings off         turns them off.
  1871. % @headings on          same as @headings double, retained for compatibility.
  1872. % @headings after       turns on double-sided headings after this page.
  1873. % @headings doubleafter turns on double-sided headings after this page.
  1874. % @headings singleafter turns on single-sided headings after this page.
  1875. % By default, they are off at the start of a document,
  1876. % and turned `on' after @end titlepage.
  1877. \def\headings #1 {\csname HEADINGS#1\endcsname}
  1878. \def\HEADINGSoff{%
  1879. \global\evenheadline={\hfil} \global\evenfootline={\hfil}
  1880. \global\oddheadline={\hfil} \global\oddfootline={\hfil}}
  1881. \HEADINGSoff
  1882. % When we turn headings on, set the page number to 1.
  1883. % For double-sided printing, put current file name in lower left corner,
  1884. % chapter name on inside top of right hand pages, document
  1885. % title on inside top of left hand pages, and page numbers on outside top
  1886. % edge of all pages.
  1887. \def\HEADINGSdouble{%
  1888. \global\pageno=1
  1889. \global\evenfootline={\hfil}
  1890. \global\oddfootline={\hfil}
  1891. \global\evenheadline={\line{\folio\hfil\thistitle}}
  1892. \global\oddheadline={\line{\thischapter\hfil\folio}}
  1893. \global\let\contentsalignmacro = \chapoddpage
  1894. \let\contentsalignmacro = \chappager
  1895. % For single-sided printing, chapter title goes across top left of page,
  1896. % page number on top right.
  1897. \def\HEADINGSsingle{%
  1898. \global\pageno=1
  1899. \global\evenfootline={\hfil}
  1900. \global\oddfootline={\hfil}
  1901. \global\evenheadline={\line{\thischapter\hfil\folio}}
  1902. \global\oddheadline={\line{\thischapter\hfil\folio}}
  1903. \global\let\contentsalignmacro = \chappager
  1904. \def\HEADINGSon{\HEADINGSdouble}
  1905. \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
  1906. \let\HEADINGSdoubleafter=\HEADINGSafter
  1907. \def\HEADINGSdoublex{%
  1908. \global\evenfootline={\hfil}
  1909. \global\oddfootline={\hfil}
  1910. \global\evenheadline={\line{\folio\hfil\thistitle}}
  1911. \global\oddheadline={\line{\thischapter\hfil\folio}}
  1912. \global\let\contentsalignmacro = \chapoddpage
  1913. \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
  1914. \def\HEADINGSsinglex{%
  1915. \global\evenfootline={\hfil}
  1916. \global\oddfootline={\hfil}
  1917. \global\evenheadline={\line{\thischapter\hfil\folio}}
  1918. \global\oddheadline={\line{\thischapter\hfil\folio}}
  1919. \global\let\contentsalignmacro = \chappager
  1920. % Subroutines used in generating headings
  1921. % This produces Day Month Year style of output.
  1922. % Only define if not already defined, in case a txi-??.tex file has set
  1923. % up a different format (e.g., txi-cs.tex does this).
  1924. \ifx\today\undefined
  1925. \def\today{%
  1926.   \number\day\space
  1927.   \ifcase\month
  1928.   \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
  1929.   \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
  1930.   \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
  1931.   \fi
  1932.   \space\number\year}
  1933. % @settitle line...  specifies the title of the document, for headings.
  1934. % It generates no output of its own.
  1935. \def\thistitle{\putwordNoTitle}
  1936. \def\settitle{\parsearg{\gdef\thistitle}}
  1937. \message{tables,}
  1938. % Tables -- @table, @ftable, @vtable, @item(x).
  1939. % default indentation of table text
  1940. \newdimen\tableindent \tableindent=.8in
  1941. % default indentation of @itemize and @enumerate text
  1942. \newdimen\itemindent  \itemindent=.3in
  1943. % margin between end of table item and start of table text.
  1944. \newdimen\itemmargin  \itemmargin=.1in
  1945. % used internally for \itemindent minus \itemmargin
  1946. \newdimen\itemmax
  1947. % Note @table, @ftable, and @vtable define @item, @itemx, etc., with
  1948. % these defs.
  1949. % They also define \itemindex
  1950. % to index the item name in whatever manner is desired (perhaps none).
  1951. \newif\ifitemxneedsnegativevskip
  1952. \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
  1953. \def\internalBitem{\smallbreak \parsearg\itemzzz}
  1954. \def\internalBitemx{\itemxpar \parsearg\itemzzz}
  1955. \def\itemzzz #1{\begingroup %
  1956.   \advance\hsize by -\rightskip
  1957.   \advance\hsize by -\tableindent
  1958.   \setbox0=\hbox{\itemindicate{#1}}%
  1959.   \itemindex{#1}%
  1960.   \nobreak % This prevents a break before @itemx.
  1961.   % If the item text does not fit in the space we have, put it on a line
  1962.   % by itself, and do not allow a page break either before or after that
  1963.   % line.  We do not start a paragraph here because then if the next
  1964.   % command is, e.g., @kindex, the whatsit would get put into the
  1965.   % horizontal list on a line by itself, resulting in extra blank space.
  1966.   \ifdim \wd0>\itemmax
  1967.     %
  1968.     % Make this a paragraph so we get the \parskip glue and wrapping,
  1969.     % but leave it ragged-right.
  1970.     \begingroup
  1971.       \advance\leftskip by-\tableindent
  1972.       \advance\hsize by\tableindent
  1973.       \advance\rightskip by0pt plus1fil
  1974.       \leavevmode\unhbox0\par
  1975.     \endgroup
  1976.     %
  1977.     % We're going to be starting a paragraph, but we don't want the
  1978.     % \parskip glue -- logically it's part of the @item we just started.
  1979.     \nobreak \vskip-\parskip
  1980.     %
  1981.     % Stop a page break at the \parskip glue coming up.  However, if
  1982.     % what follows is an environment such as @example, there will be no
  1983.     % \parskip glue; then the negative vskip we just inserted would
  1984.     % cause the example and the item to crash together.  So we use this
  1985.     % bizarre value of 10001 as a signal to \aboveenvbreak to insert
  1986.     % \parskip glue after all.  Section titles are handled this way also.
  1987.     % 
  1988.     \penalty 10001
  1989.     \endgroup
  1990.     \itemxneedsnegativevskipfalse
  1991.   \else
  1992.     % The item text fits into the space.  Start a paragraph, so that the
  1993.     % following text (if any) will end up on the same line.
  1994.     \noindent
  1995.     % Do this with kerns and \unhbox so that if there is a footnote in
  1996.     % the item text, it can migrate to the main vertical list and
  1997.     % eventually be printed.
  1998.     \nobreak\kern-\tableindent
  1999.     \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
  2000.     \unhbox0
  2001.     \nobreak\kern\dimen0
  2002.     \endgroup
  2003.     \itemxneedsnegativevskiptrue
  2004.   \fi
  2005. \def\item{\errmessage{@item while not in a list environment}}
  2006. \def\itemx{\errmessage{@itemx while not in a list environment}}
  2007. % @table, @ftable, @vtable.
  2008. \envdef\table{%
  2009.   \let\itemindex\gobble
  2010.   \tablecheck{table}%
  2011. \envdef\ftable{%
  2012.   \def\itemindex ##1{\doind {fn}{\code{##1}}}%
  2013.   \tablecheck{ftable}%
  2014. \envdef\vtable{%
  2015.   \def\itemindex ##1{\doind {vr}{\code{##1}}}%
  2016.   \tablecheck{vtable}%
  2017. \def\tablecheck#1{%
  2018.   \ifnum \the\catcode`\^^M=\active
  2019.     \endgroup
  2020.     \errmessage{This command won't work in this context; perhaps the problem is
  2021.       that we are \inenvironment\thisenv}%
  2022.     \def\next{\doignore{#1}}%
  2023.   \else
  2024.     \let\next\tablex
  2025.   \fi
  2026.   \next
  2027. \def\tablex#1{%
  2028.   \def\itemindicate{#1}%
  2029.   \parsearg\tabley
  2030. \def\tabley#1{%
  2031.     \makevalueexpandable
  2032.     \edef\temp{\noexpand\tablez #1\space\space\space}%
  2033.     \expandafter
  2034.   }\temp \endtablez
  2035. \def\tablez #1 #2 #3 #4\endtablez{%
  2036.   \aboveenvbreak
  2037.   \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
  2038.   \ifnum 0#2>0 \tableindent=#2\mil \fi
  2039.   \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
  2040.   \itemmax=\tableindent
  2041.   \advance \itemmax by -\itemmargin
  2042.   \advance \leftskip by \tableindent
  2043.   \exdentamount=\tableindent
  2044.   \parindent = 0pt
  2045.   \parskip = \smallskipamount
  2046.   \ifdim \parskip=0pt \parskip=2pt \fi
  2047.   \let\item = \internalBitem
  2048.   \let\itemx = \internalBitemx
  2049. \def\Etable{\endgraf\afterenvbreak}
  2050. \let\Eftable\Etable
  2051. \let\Evtable\Etable
  2052. \let\Eitemize\Etable
  2053. \let\Eenumerate\Etable
  2054. % This is the counter used by @enumerate, which is really @itemize
  2055. \newcount \itemno
  2056. \envdef\itemize{\parsearg\doitemize}
  2057. \def\doitemize#1{%
  2058.   \aboveenvbreak
  2059.   \itemmax=\itemindent
  2060.   \advance\itemmax by -\itemmargin
  2061.   \advance\leftskip by \itemindent
  2062.   \exdentamount=\itemindent
  2063.   \parindent=0pt
  2064.   \parskip=\smallskipamount
  2065.   \ifdim\parskip=0pt \parskip=2pt \fi
  2066.   \def\itemcontents{#1}%
  2067.   % @itemize with no arg is equivalent to @itemize @bullet.
  2068.   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
  2069.   \let\item=\itemizeitem
  2070. % Definition of @item while inside @itemize and @enumerate.
  2071. \def\itemizeitem{%
  2072.   \advance\itemno by 1  % for enumerations
  2073.   {\let\par=\endgraf \smallbreak}% reasonable place to break
  2074.    % If the document has an @itemize directly after a section title, a
  2075.    % \nobreak will be last on the list, and \sectionheading will have
  2076.    % done a \vskip-\parskip.  In that case, we don't want to zero
  2077.    % parskip, or the item text will crash with the heading.  On the
  2078.    % other hand, when there is normal text preceding the item (as there
  2079.    % usually is), we do want to zero parskip, or there would be too much
  2080.    % space.  In that case, we won't have a \nobreak before.  At least
  2081.    % that's the theory.
  2082.    \ifnum\lastpenalty<10000 \parskip=0in \fi
  2083.    \noindent
  2084.    \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
  2085.    \vadjust{\penalty 1200}}% not good to break after first line of item.
  2086.   \flushcr
  2087. % \splitoff TOKENS\endmark defines \first to be the first token in
  2088. % TOKENS, and \rest to be the remainder.
  2089. \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
  2090. % Allow an optional argument of an uppercase letter, lowercase letter,
  2091. % or number, to specify the first label in the enumerated list.  No
  2092. % argument is the same as `1'.
  2093. \envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
  2094. \def\enumeratey #1 #2\endenumeratey{%
  2095.   % If we were given no argument, pretend we were given `1'.
  2096.   \def\thearg{#1}%
  2097.   \ifx\thearg\empty \def\thearg{1}\fi
  2098.   % Detect if the argument is a single token.  If so, it might be a
  2099.   % letter.  Otherwise, the only valid thing it can be is a number.
  2100.   % (We will always have one token, because of the test we just made.
  2101.   % This is a good thing, since \splitoff doesn't work given nothing at
  2102.   % all -- the first parameter is undelimited.)
  2103.   \expandafter\splitoff\thearg\endmark
  2104.   \ifx\rest\empty
  2105.     % Only one token in the argument.  It could still be anything.
  2106.     % A ``lowercase letter'' is one whose \lccode is nonzero.
  2107.     % An ``uppercase letter'' is one whose \lccode is both nonzero, and
  2108.     %   not equal to itself.
  2109.     % Otherwise, we assume it's a number.
  2110.     %
  2111.     % We need the \relax at the end of the \ifnum lines to stop TeX from
  2112.     % continuing to look for a <number>.
  2113.     %
  2114.     \ifnum\lccode\expandafter`\thearg=0\relax
  2115.       \numericenumerate % a number (we hope)
  2116.     \else
  2117.       % It's a letter.
  2118.       \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
  2119.         \lowercaseenumerate % lowercase letter
  2120.       \else
  2121.         \uppercaseenumerate % uppercase letter
  2122.       \fi
  2123.     \fi
  2124.   \else
  2125.     % Multiple tokens in the argument.  We hope it's a number.
  2126.     \numericenumerate
  2127.   \fi
  2128. % An @enumerate whose labels are integers.  The starting integer is
  2129. % given in \thearg.
  2130. \def\numericenumerate{%
  2131.   \itemno = \thearg
  2132.   \startenumeration{\the\itemno}%
  2133. % The starting (lowercase) letter is in \thearg.
  2134. \def\lowercaseenumerate{%
  2135.   \itemno = \expandafter`\thearg
  2136.   \startenumeration{%
  2137.     % Be sure we're not beyond the end of the alphabet.
  2138.     \ifnum\itemno=0
  2139.       \errmessage{No more lowercase letters in @enumerate; get a bigger
  2140.                   alphabet}%
  2141.     \fi
  2142.     \char\lccode\itemno
  2143. % The starting (uppercase) letter is in \thearg.
  2144. \def\uppercaseenumerate{%
  2145.   \itemno = \expandafter`\thearg
  2146.   \startenumeration{%
  2147.     % Be sure we're not beyond the end of the alphabet.
  2148.     \ifnum\itemno=0
  2149.       \errmessage{No more uppercase letters in @enumerate; get a bigger
  2150.                   alphabet}
  2151.     \fi
  2152.     \char\uccode\itemno
  2153. % Call \doitemize, adding a period to the first argument and supplying the
  2154. % common last two arguments.  Also subtract one from the initial value in
  2155. % \itemno, since @item increments \itemno.
  2156. \def\startenumeration#1{%
  2157.   \advance\itemno by -1
  2158.   \doitemize{#1.}\flushcr
  2159. % @alphaenumerate and @capsenumerate are abbreviations for giving an arg
  2160. % to @enumerate.
  2161. \def\alphaenumerate{\enumerate{a}}
  2162. \def\capsenumerate{\enumerate{A}}
  2163. \def\Ealphaenumerate{\Eenumerate}
  2164. \def\Ecapsenumerate{\Eenumerate}
  2165. % @multitable macros
  2166. % Amy Hendrickson, 8/18/94, 3/6/96
  2167. % @multitable ... @end multitable will make as many columns as desired.
  2168. % Contents of each column will wrap at width given in preamble.  Width
  2169. % can be specified either with sample text given in a template line,
  2170. % or in percent of \hsize, the current width of text on page.
  2171. % Table can continue over pages but will only break between lines.
  2172. % To make preamble:
  2173. % Either define widths of columns in terms of percent of \hsize:
  2174. %   @multitable @columnfractions .25 .3 .45
  2175. %   @item ...
  2176. %   Numbers following @columnfractions are the percent of the total
  2177. %   current hsize to be used for each column. You may use as many
  2178. %   columns as desired.
  2179. % Or use a template:
  2180. %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
  2181. %   @item ...
  2182. %   using the widest term desired in each column.
  2183. % Each new table line starts with @item, each subsequent new column
  2184. % starts with @tab. Empty columns may be produced by supplying @tab's
  2185. % with nothing between them for as many times as empty columns are needed,
  2186. % ie, @tab@tab@tab will produce two empty columns.
  2187. % @item, @tab do not need to be on their own lines, but it will not hurt
  2188. % if they are.
  2189. % Sample multitable:
  2190. %   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
  2191. %   @item first col stuff @tab second col stuff @tab third col
  2192. %   @item
  2193. %   first col stuff
  2194. %   @tab
  2195. %   second col stuff
  2196. %   @tab
  2197. %   third col
  2198. %   @item first col stuff @tab second col stuff
  2199. %   @tab Many paragraphs of text may be used in any column.
  2200. %         They will wrap at the width determined by the template.
  2201. %   @item@tab@tab This will be in third column.
  2202. %   @end multitable
  2203. % Default dimensions may be reset by user.
  2204. % @multitableparskip is vertical space between paragraphs in table.
  2205. % @multitableparindent is paragraph indent in table.
  2206. % @multitablecolmargin is horizontal space to be left between columns.
  2207. % @multitablelinespace is space to leave between table items, baseline
  2208. %                                                            to baseline.
  2209. %   0pt means it depends on current normal line spacing.
  2210. \newskip\multitableparskip
  2211. \newskip\multitableparindent
  2212. \newdimen\multitablecolspace
  2213. \newskip\multitablelinespace
  2214. \multitableparskip=0pt
  2215. \multitableparindent=6pt
  2216. \multitablecolspace=12pt
  2217. \multitablelinespace=0pt
  2218. % Macros used to set up halign preamble:
  2219. \let\endsetuptable\relax
  2220. \def\xendsetuptable{\endsetuptable}
  2221. \let\columnfractions\relax
  2222. \def\xcolumnfractions{\columnfractions}
  2223. \newif\ifsetpercent
  2224. % #1 is the @columnfraction, usually a decimal number like .5, but might
  2225. % be just 1.  We just use it, whatever it is.
  2226. \def\pickupwholefraction#1 {%
  2227.   \global\advance\colcount by 1
  2228.   \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
  2229.   \setuptable
  2230. \newcount\colcount
  2231. \def\setuptable#1{%
  2232.   \def\firstarg{#1}%
  2233.   \ifx\firstarg\xendsetuptable
  2234.     \let\go = \relax
  2235.   \else
  2236.     \ifx\firstarg\xcolumnfractions
  2237.       \global\setpercenttrue
  2238.     \else
  2239.       \ifsetpercent
  2240.          \let\go\pickupwholefraction
  2241.       \else
  2242.          \global\advance\colcount by 1
  2243.          \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
  2244.                    % separator; typically that is always in the input, anyway.
  2245.          \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
  2246.       \fi
  2247.     \fi
  2248.     \ifx\go\pickupwholefraction
  2249.       % Put the argument back for the \pickupwholefraction call, so
  2250.       % we'll always have a period there to be parsed.
  2251.       \def\go{\pickupwholefraction#1}%
  2252.     \else
  2253.       \let\go = \setuptable
  2254.     \fi%
  2255.   \fi
  2256.   \go
  2257. % multitable-only commands.
  2258. % @headitem starts a heading row, which we typeset in bold.
  2259. % Assignments have to be global since we are inside the implicit group
  2260. % of an alignment entry.  Note that \everycr resets \everytab.
  2261. \def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
  2262. % A \tab used to include \hskip1sp.  But then the space in a template
  2263. % line is not enough.  That is bad.  So let's go back to just `&' until
  2264. % we encounter the problem it was intended to solve again.
  2265. %                    --karl, nathan@acm.org, 20apr99.
  2266. \def\tab{\checkenv\multitable &\the\everytab}%
  2267. % @multitable ... @end multitable definitions:
  2268. \newtoks\everytab  % insert after every tab.
  2269. \envdef\multitable{%
  2270.   \vskip\parskip
  2271.   \startsavinginserts
  2272.   % @item within a multitable starts a normal row.
  2273.   % We use \def instead of \let so that if one of the multitable entries
  2274.   % contains an @itemize, we don't choke on the \item (seen as \crcr aka
  2275.   % \endtemplate) expanding \doitemize.
  2276.   \def\item{\crcr}%
  2277.   \tolerance=9500
  2278.   \hbadness=9500
  2279.   \setmultitablespacing
  2280.   \parskip=\multitableparskip
  2281.   \parindent=\multitableparindent
  2282.   \overfullrule=0pt
  2283.   \global\colcount=0
  2284.   \everycr = {%
  2285.     \noalign{%
  2286.       \global\everytab={}%
  2287.       \global\colcount=0 % Reset the column counter.
  2288.       % Check for saved footnotes, etc.
  2289.       \checkinserts
  2290.       % Keeps underfull box messages off when table breaks over pages.
  2291.       %\filbreak
  2292.     % Maybe so, but it also creates really weird page breaks when the
  2293.     % table breaks over pages. Wouldn't \vfil be better?  Wait until the
  2294.     % problem manifests itself, so it can be fixed for real --karl.
  2295.     }%
  2296.   \parsearg\domultitable
  2297. \def\domultitable#1{%
  2298.   % To parse everything between @multitable and @item:
  2299.   \setuptable#1 \endsetuptable
  2300.   % This preamble sets up a generic column definition, which will
  2301.   % be used as many times as user calls for columns.
  2302.   % \vtop will set a single line and will also let text wrap and
  2303.   % continue for many paragraphs if desired.
  2304.   \halign\bgroup &%
  2305.     \global\advance\colcount by 1
  2306.     \multistrut
  2307.     \vtop{%
  2308.       % Use the current \colcount to find the correct column width:
  2309.       \hsize=\expandafter\csname col\the\colcount\endcsname
  2310.       %
  2311.       % In order to keep entries from bumping into each other
  2312.       % we will add a \leftskip of \multitablecolspace to all columns after
  2313.       % the first one.
  2314.       %
  2315.       % If a template has been used, we will add \multitablecolspace
  2316.       % to the width of each template entry.
  2317.       %
  2318.       % If the user has set preamble in terms of percent of \hsize we will
  2319.       % use that dimension as the width of the column, and the \leftskip
  2320.       % will keep entries from bumping into each other.  Table will start at
  2321.       % left margin and final column will justify at right margin.
  2322.       %
  2323.       % Make sure we don't inherit \rightskip from the outer environment.
  2324.       \rightskip=0pt
  2325.       \ifnum\colcount=1
  2326.     % The first column will be indented with the surrounding text.
  2327.     \advance\hsize by\leftskip
  2328.       \else
  2329.     \ifsetpercent \else
  2330.       % If user has not set preamble in terms of percent of \hsize
  2331.       % we will advance \hsize by \multitablecolspace.
  2332.       \advance\hsize by \multitablecolspace
  2333.        % In either case we will make \leftskip=\multitablecolspace:
  2334.       \leftskip=\multitablecolspace
  2335.       \fi
  2336.       % Ignoring space at the beginning and end avoids an occasional spurious
  2337.       % blank line, when TeX decides to break the line at the space before the
  2338.       % box from the multistrut, so the strut ends up on a line by itself.
  2339.       % For example:
  2340.       % @multitable @columnfractions .11 .89
  2341.       % @item @code{#}
  2342.       % @tab Legal holiday which is valid in major parts of the whole country.
  2343.       % Is automatically provided with highlighting sequences respectively
  2344.       % marking characters.
  2345.       \noindent\ignorespaces##\unskip\multistrut
  2346.     }\cr
  2347. \def\Emultitable{%
  2348.   \crcr
  2349.   \egroup % end the \halign
  2350.   \global\setpercentfalse
  2351. \def\setmultitablespacing{%
  2352.   \def\multistrut{\strut}% just use the standard line spacing
  2353.   % Compute \multitablelinespace (if not defined by user) for use in
  2354.   % \multitableparskip calculation.  We used define \multistrut based on
  2355.   % this, but (ironically) that caused the spacing to be off.
  2356.   % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
  2357. \ifdim\multitablelinespace=0pt
  2358. \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
  2359. \global\advance\multitablelinespace by-\ht0
  2360. %% Test to see if parskip is larger than space between lines of
  2361. %% table. If not, do nothing.
  2362. %%        If so, set to same dimension as multitablelinespace.
  2363. \ifdim\multitableparskip>\multitablelinespace
  2364. \global\multitableparskip=\multitablelinespace
  2365. \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
  2366.                                       %% than skip between lines in the table.
  2367. \ifdim\multitableparskip=0pt
  2368. \global\multitableparskip=\multitablelinespace
  2369. \global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
  2370.                                       %% than skip between lines in the table.
  2371. \message{conditionals,}
  2372. % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
  2373. % @ifnotxml always succeed.  They currently do nothing; we don't
  2374. % attempt to check whether the conditionals are properly nested.  But we
  2375. % have to remember that they are conditionals, so that @end doesn't
  2376. % attempt to close an environment group.
  2377. \def\makecond#1{%
  2378.   \expandafter\let\csname #1\endcsname = \relax
  2379.   \expandafter\let\csname iscond.#1\endcsname = 1
  2380. \makecond{iftex}
  2381. \makecond{ifnotdocbook}
  2382. \makecond{ifnothtml}
  2383. \makecond{ifnotinfo}
  2384. \makecond{ifnotplaintext}
  2385. \makecond{ifnotxml}
  2386. % Ignore @ignore, @ifhtml, @ifinfo, and the like.
  2387. \def\direntry{\doignore{direntry}}
  2388. \def\documentdescription{\doignore{documentdescription}}
  2389. \def\docbook{\doignore{docbook}}
  2390. \def\html{\doignore{html}}
  2391. \def\ifdocbook{\doignore{ifdocbook}}
  2392. \def\ifhtml{\doignore{ifhtml}}
  2393. \def\ifinfo{\doignore{ifinfo}}
  2394. \def\ifnottex{\doignore{ifnottex}}
  2395. \def\ifplaintext{\doignore{ifplaintext}}
  2396. \def\ifxml{\doignore{ifxml}}
  2397. \def\ignore{\doignore{ignore}}
  2398. \def\menu{\doignore{menu}}
  2399. \def\xml{\doignore{xml}}
  2400. % Ignore text until a line `@end #1', keeping track of nested conditionals.
  2401. % A count to remember the depth of nesting.
  2402. \newcount\doignorecount
  2403. \def\doignore#1{\begingroup
  2404.   % Scan in ``verbatim'' mode:
  2405.   \catcode`\@ = \other
  2406.   \catcode`\{ = \other
  2407.   \catcode`\} = \other
  2408.   % Make sure that spaces turn into tokens that match what \doignoretext wants.
  2409.   \spaceisspace
  2410.   % Count number of #1's that we've seen.
  2411.   \doignorecount = 0
  2412.   % Swallow text until we reach the matching `@end #1'.
  2413.   \dodoignore{#1}%
  2414. { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
  2415.   \obeylines %
  2416.   \gdef\dodoignore#1{%
  2417.     % #1 contains the command name as a string, e.g., `ifinfo'.
  2418.     %
  2419.     % Define a command to find the next `@end #1', which must be on a line
  2420.     % by itself.
  2421.     \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}%
  2422.     % And this command to find another #1 command, at the beginning of a
  2423.     % line.  (Otherwise, we would consider a line `@c @ifset', for
  2424.     % example, to count as an @ifset for nesting.)
  2425.     \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
  2426.     %
  2427.     % And now expand that command.
  2428.     \obeylines %
  2429.     \doignoretext ^^M%
  2430. \def\doignoreyyy#1{%
  2431.   \def\temp{#1}%
  2432.   \ifx\temp\empty            % Nothing found.
  2433.     \let\next\doignoretextzzz
  2434.   \else                    % Found a nested condition, ...
  2435.     \advance\doignorecount by 1
  2436.     \let\next\doignoretextyyy        % ..., look for another.
  2437.     % If we're here, #1 ends with ^^M\ifinfo (for example).
  2438.   \fi
  2439.   \next #1% the token \_STOP_ is present just after this macro.
  2440. % We have to swallow the remaining "\_STOP_".
  2441. \def\doignoretextzzz#1{%
  2442.   \ifnum\doignorecount = 0    % We have just found the outermost @end.
  2443.     \let\next\enddoignore
  2444.   \else                % Still inside a nested condition.
  2445.     \advance\doignorecount by -1
  2446.     \let\next\doignoretext      % Look for the next @end.
  2447.   \fi
  2448.   \next
  2449. % Finish off ignored text.
  2450. \def\enddoignore{\endgroup\ignorespaces}
  2451. % @set VAR sets the variable VAR to an empty value.
  2452. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
  2453. % Since we want to separate VAR from REST-OF-LINE (which might be
  2454. % empty), we can't just use \parsearg; we have to insert a space of our
  2455. % own to delimit the rest of the line, and then take it out again if we
  2456. % didn't need it.
  2457. % We rely on the fact that \parsearg sets \catcode`\ =10.
  2458. \parseargdef\set{\setyyy#1 \endsetyyy}
  2459. \def\setyyy#1 #2\endsetyyy{%
  2460.     \makevalueexpandable
  2461.     \def\temp{#2}%
  2462.     \edef\next{\gdef\makecsname{SET#1}}%
  2463.     \ifx\temp\empty
  2464.       \next{}%
  2465.     \else
  2466.       \setzzz#2\endsetzzz
  2467.     \fi
  2468. % Remove the trailing space \setxxx inserted.
  2469. \def\setzzz#1 \endsetzzz{\next{#1}}
  2470. % @clear VAR clears (i.e., unsets) the variable VAR.
  2471. \parseargdef\clear{%
  2472.     \makevalueexpandable
  2473.     \global\expandafter\let\csname SET#1\endcsname=\relax
  2474. % @value{foo} gets the text saved in variable foo.
  2475. \def\value{\begingroup\makevalueexpandable\valuexxx}
  2476. \def\valuexxx#1{\expandablevalue{#1}\endgroup}
  2477.   \catcode`\- = \active \catcode`\_ = \active
  2478.   \gdef\makevalueexpandable{%
  2479.     \let\value = \expandablevalue
  2480.     % We don't want these characters active, ...
  2481.     \catcode`\-=\other \catcode`\_=\other
  2482.     % ..., but we might end up with active ones in the argument if
  2483.     % we're called from @code, as @code{@value{foo-bar_}}, though.
  2484.     % So \let them to their normal equivalents.
  2485.     \let-\realdash \let_\normalunderscore
  2486. % We have this subroutine so that we can handle at least some @value's
  2487. % properly in indexes (we call \makevalueexpandable in \indexdummies).
  2488. % The command has to be fully expandable (if the variable is set), since
  2489. % the result winds up in the index file.  This means that if the
  2490. % variable's value contains other Texinfo commands, it's almost certain
  2491. % it will fail (although perhaps we could fix that with sufficient work
  2492. % to do a one-level expansion on the result, instead of complete).
  2493. \def\expandablevalue#1{%
  2494.   \expandafter\ifx\csname SET#1\endcsname\relax
  2495.     {[No value for ``#1'']}%
  2496.     \message{Variable `#1', used in @value, is not set.}%
  2497.   \else
  2498.     \csname SET#1\endcsname
  2499.   \fi
  2500. % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
  2501. % with @set.
  2502. % To get special treatment of `@end ifset,' call \makeond and the redefine.
  2503. \makecond{ifset}
  2504. \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
  2505. \def\doifset#1#2{%
  2506.     \makevalueexpandable
  2507.     \let\next=\empty
  2508.     \expandafter\ifx\csname SET#2\endcsname\relax
  2509.       #1% If not set, redefine \next.
  2510.     \fi
  2511.     \expandafter
  2512.   }\next
  2513. \def\ifsetfail{\doignore{ifset}}
  2514. % @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
  2515. % defined with @set, or has been undefined with @clear.
  2516. % The `\else' inside the `\doifset' parameter is a trick to reuse the
  2517. % above code: if the variable is not set, do nothing, if it is set,
  2518. % then redefine \next to \ifclearfail.
  2519. \makecond{ifclear}
  2520. \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
  2521. \def\ifclearfail{\doignore{ifclear}}
  2522. % @dircategory CATEGORY  -- specify a category of the dir file
  2523. % which this file should belong to.  Ignore this in TeX.
  2524. \let\dircategory=\comment
  2525. % @defininfoenclose.
  2526. \let\definfoenclose=\comment
  2527. \message{indexing,}
  2528. % Index generation facilities
  2529. % Define \newwrite to be identical to plain tex's \newwrite
  2530. % except not \outer, so it can be used within macros and \if's.
  2531. \edef\newwrite{\makecsname{ptexnewwrite}}
  2532. % \newindex {foo} defines an index named foo.
  2533. % It automatically defines \fooindex such that
  2534. % \fooindex ...rest of line... puts an entry in the index foo.
  2535. % It also defines \fooindfile to be the number of the output channel for
  2536. % the file that accumulates this index.  The file's extension is foo.
  2537. % The name of an index should be no more than 2 characters long
  2538. % for the sake of vms.
  2539. \def\newindex#1{%
  2540.   \iflinks
  2541.     \expandafter\newwrite \csname#1indfile\endcsname
  2542.     \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
  2543.   \fi
  2544.   \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
  2545.     \noexpand\doindex{#1}}
  2546. % @defindex foo  ==  \newindex{foo}
  2547. \def\defindex{\parsearg\newindex}
  2548. % Define @defcodeindex, like @defindex except put all entries in @code.
  2549. \def\defcodeindex{\parsearg\newcodeindex}
  2550. \def\newcodeindex#1{%
  2551.   \iflinks
  2552.     \expandafter\newwrite \csname#1indfile\endcsname
  2553.     \openout \csname#1indfile\endcsname \jobname.#1
  2554.   \fi
  2555.   \expandafter\xdef\csname#1index\endcsname{%
  2556.     \noexpand\docodeindex{#1}}%
  2557. % @synindex foo bar    makes index foo feed into index bar.
  2558. % Do this instead of @defindex foo if you don't want it as a separate index.
  2559. % @syncodeindex foo bar   similar, but put all entries made for index foo
  2560. % inside @code.
  2561. \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
  2562. \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
  2563. % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
  2564. % #3 the target index (bar).
  2565. \def\dosynindex#1#2#3{%
  2566.   % Only do \closeout if we haven't already done it, else we'll end up
  2567.   % closing the target index.
  2568.   \expandafter \ifx\csname donesynindex#2\endcsname \undefined
  2569.     % The \closeout helps reduce unnecessary open files; the limit on the
  2570.     % Acorn RISC OS is a mere 16 files.
  2571.     \expandafter\closeout\csname#2indfile\endcsname
  2572.     \expandafter\let\csname\donesynindex#2\endcsname = 1
  2573.   \fi
  2574.   % redefine \fooindfile:
  2575.   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
  2576.   \expandafter\let\csname#2indfile\endcsname=\temp
  2577.   % redefine \fooindex:
  2578.   \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
  2579. % Define \doindex, the driver for all \fooindex macros.
  2580. % Argument #1 is generated by the calling \fooindex macro,
  2581. %  and it is "foo", the name of the index.
  2582. % \doindex just uses \parsearg; it calls \doind for the actual work.
  2583. % This is because \doind is more useful to call from other macros.
  2584. % There is also \dosubind {index}{topic}{subtopic}
  2585. % which makes an entry in a two-level index such as the operation index.
  2586. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
  2587. \def\singleindexer #1{\doind{\indexname}{#1}}
  2588. % like the previous two, but they put @code around the argument.
  2589. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
  2590. \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
  2591. % Take care of Texinfo commands that can appear in an index entry.
  2592. % Since there are some commands we want to expand, and others we don't,
  2593. % we have to laboriously prevent expansion for those that we don't.
  2594. \def\indexdummies{%
  2595.   \escapechar = `\\     % use backslash in output files.
  2596.   \def\@{@}% change to @@ when we switch to @ as escape char in index files.
  2597.   \def\ {\realbackslash\space }%
  2598.   % Need these in case \tex is in effect and \{ is a \delimiter again.
  2599.   % But can't use \lbracecmd and \rbracecmd because texindex assumes
  2600.   % braces and backslashes are used only as delimiters.
  2601.   \let\{ = \mylbrace
  2602.   \let\} = \myrbrace
  2603.   % Do the redefinitions.
  2604.   \commondummies
  2605. % For the aux and toc files, @ is the escape character.  So we want to
  2606. % redefine everything using @ as the escape character (instead of
  2607. % \realbackslash, still used for index files).  When everything uses @,
  2608. % this will be simpler.
  2609. \def\atdummies{%
  2610.   \def\@{@@}%
  2611.   \def\ {@ }%
  2612.   \let\{ = \lbraceatcmd
  2613.   \let\} = \rbraceatcmd
  2614.   % Do the redefinitions.
  2615.   \commondummies
  2616. % Called from \indexdummies and \atdummies.
  2617. \def\commondummies{%
  2618.   % \definedummyword defines \#1 as \string\#1\space, thus effectively
  2619.   % preventing its expansion.  This is used only for control% words,
  2620.   % not control letters, because the \space would be incorrect for
  2621.   % control characters, but is needed to separate the control word
  2622.   % from whatever follows.
  2623.   % For control letters, we have \definedummyletter, which omits the
  2624.   % space.
  2625.   % These can be used both for control words that take an argument and
  2626.   % those that do not.  If it is followed by {arg} in the input, then
  2627.   % that will dutifully get written to the index (or wherever).
  2628.   \def\definedummyword  ##1{\def##1{\string##1\space}}%
  2629.   \def\definedummyletter##1{\def##1{\string##1}}%
  2630.   \let\definedummyaccent\definedummyletter
  2631.   \commondummiesnofonts
  2632.   \definedummyletter\_%
  2633.   % Non-English letters.
  2634.   \definedummyword\AA
  2635.   \definedummyword\AE
  2636.   \definedummyword\L
  2637.   \definedummyword\OE
  2638.   \definedummyword\O
  2639.   \definedummyword\aa
  2640.   \definedummyword\ae
  2641.   \definedummyword\l
  2642.   \definedummyword\oe
  2643.   \definedummyword\o
  2644.   \definedummyword\ss
  2645.   \definedummyword\exclamdown
  2646.   \definedummyword\questiondown
  2647.   \definedummyword\ordf
  2648.   \definedummyword\ordm
  2649.   % Although these internal commands shouldn't show up, sometimes they do.
  2650.   \definedummyword\bf
  2651.   \definedummyword\gtr
  2652.   \definedummyword\hat
  2653.   \definedummyword\less
  2654.   \definedummyword\sf
  2655.   \definedummyword\sl
  2656.   \definedummyword\tclose
  2657.   \definedummyword\tt
  2658.   \definedummyword\LaTeX
  2659.   \definedummyword\TeX
  2660.   % Assorted special characters.
  2661.   \definedummyword\bullet
  2662.   \definedummyword\comma
  2663.   \definedummyword\copyright
  2664.   \definedummyword\registeredsymbol
  2665.   \definedummyword\dots
  2666.   \definedummyword\enddots
  2667.   \definedummyword\equiv
  2668.   \definedummyword\error
  2669.   \definedummyword\euro
  2670.   \definedummyword\expansion
  2671.   \definedummyword\minus
  2672.   \definedummyword\pounds
  2673.   \definedummyword\point
  2674.   \definedummyword\print
  2675.   \definedummyword\result
  2676.   % We want to disable all macros so that they are not expanded by \write.
  2677.   \macrolist
  2678.   \normalturnoffactive
  2679.   % Handle some cases of @value -- where it does not contain any
  2680.   % (non-fully-expandable) commands.
  2681.   \makevalueexpandable
  2682. % \commondummiesnofonts: common to \commondummies and \indexnofonts.
  2683. % Better have this without active chars.
  2684.   \catcode`\~=\other
  2685.   \gdef\commondummiesnofonts{%
  2686.     % Control letters and accents.
  2687.     \definedummyletter\!%
  2688.     \definedummyaccent\"%
  2689.     \definedummyaccent\'%
  2690.     \definedummyletter\*%
  2691.     \definedummyaccent\,%
  2692.     \definedummyletter\.%
  2693.     \definedummyletter\/%
  2694.     \definedummyletter\:%
  2695.     \definedummyaccent\=%
  2696.     \definedummyletter\?%
  2697.     \definedummyaccent\^%
  2698.     \definedummyaccent\`%
  2699.     \definedummyaccent\~%
  2700.     \definedummyword\u
  2701.     \definedummyword\v
  2702.     \definedummyword\H
  2703.     \definedummyword\dotaccent
  2704.     \definedummyword\ringaccent
  2705.     \definedummyword\tieaccent
  2706.     \definedummyword\ubaraccent
  2707.     \definedummyword\udotaccent
  2708.     \definedummyword\dotless
  2709.     %
  2710.     % Texinfo font commands.
  2711.     \definedummyword\b
  2712.     \definedummyword\i
  2713.     \definedummyword\r
  2714.     \definedummyword\sc
  2715.     \definedummyword\t
  2716.     %
  2717.     % Commands that take arguments.
  2718.     \definedummyword\acronym
  2719.     \definedummyword\cite
  2720.     \definedummyword\code
  2721.     \definedummyword\command
  2722.     \definedummyword\dfn
  2723.     \definedummyword\emph
  2724.     \definedummyword\env
  2725.     \definedummyword\file
  2726.     \definedummyword\kbd
  2727.     \definedummyword\key
  2728.     \definedummyword\math
  2729.     \definedummyword\option
  2730.     \definedummyword\samp
  2731.     \definedummyword\strong
  2732.     \definedummyword\tie
  2733.     \definedummyword\uref
  2734.     \definedummyword\url
  2735.     \definedummyword\var
  2736.     \definedummyword\verb
  2737.     \definedummyword\w
  2738. % \indexnofonts is used when outputting the strings to sort the index
  2739. % by, and when constructing control sequence names.  It eliminates all
  2740. % control sequences and just writes whatever the best ASCII sort string
  2741. % would be for a given command (usually its argument).
  2742. \def\indexnofonts{%
  2743.   % Accent commands should become @asis.
  2744.   \def\definedummyaccent##1{\let##1\asis}%
  2745.   % We can just ignore other control letters.
  2746.   \def\definedummyletter##1{\let##1\empty}%
  2747.   % Hopefully, all control words can become @asis.
  2748.   \let\definedummyword\definedummyaccent
  2749.   \commondummiesnofonts
  2750.   % Don't no-op \tt, since it isn't a user-level command
  2751.   % and is used in the definitions of the active chars like <, >, |, etc.
  2752.   % Likewise with the other plain tex font commands.
  2753.   %\let\tt=\asis
  2754.   \def\ { }%
  2755.   \def\@{@}%
  2756.   % how to handle braces?
  2757.   \def\_{\normalunderscore}%
  2758.   % Non-English letters.
  2759.   \def\AA{AA}%
  2760.   \def\AE{AE}%
  2761.   \def\L{L}%
  2762.   \def\OE{OE}%
  2763.   \def\O{O}%
  2764.   \def\aa{aa}%
  2765.   \def\ae{ae}%
  2766.   \def\l{l}%
  2767.   \def\oe{oe}%
  2768.   \def\o{o}%
  2769.   \def\ss{ss}%
  2770.   \def\exclamdown{!}%
  2771.   \def\questiondown{?}%
  2772.   \def\ordf{a}%
  2773.   \def\ordm{o}%
  2774.   \def\LaTeX{LaTeX}%
  2775.   \def\TeX{TeX}%
  2776.   % Assorted special characters.
  2777.   % (The following {} will end up in the sort string, but that's ok.)
  2778.   \def\bullet{bullet}%
  2779.   \def\comma{,}%
  2780.   \def\copyright{copyright}%
  2781.   \def\registeredsymbol{R}%
  2782.   \def\dots{...}%
  2783.   \def\enddots{...}%
  2784.   \def\equiv{==}%
  2785.   \def\error{error}%
  2786.   \def\euro{euro}%
  2787.   \def\expansion{==>}%
  2788.   \def\minus{-}%
  2789.   \def\pounds{pounds}%
  2790.   \def\point{.}%
  2791.   \def\print{-|}%
  2792.   \def\result{=>}%
  2793.   % We need to get rid of all macros, leaving only the arguments (if present).
  2794.   % Of course this is not nearly correct, but it is the best we can do for now.
  2795.   % makeinfo does not expand macros in the argument to @deffn, which ends up
  2796.   % writing an index entry, and texindex isn't prepared for an index sort entry
  2797.   % that starts with \.
  2798.   % Since macro invocations are followed by braces, we can just redefine them
  2799.   % to take a single TeX argument.  The case of a macro invocation that
  2800.   % goes to end-of-line is not handled.
  2801.   \macrolist
  2802. \let\indexbackslash=0  %overridden during \printindex.
  2803. \let\SETmarginindex=\relax % put index entries in margin (undocumented)?
  2804. % Most index entries go through here, but \dosubind is the general case.
  2805. % #1 is the index name, #2 is the entry text.
  2806. \def\doind#1#2{\dosubind{#1}{#2}{}}
  2807. % Workhorse for all \fooindexes.
  2808. % #1 is name of index, #2 is stuff to put there, #3 is subentry --
  2809. % empty if called from \doind, as we usually are (the main exception
  2810. % is with most defuns, which call us directly).
  2811. \def\dosubind#1#2#3{%
  2812.   \iflinks
  2813.     % Store the main index entry text (including the third arg).
  2814.     \toks0 = {#2}%
  2815.     % If third arg is present, precede it with a space.
  2816.     \def\thirdarg{#3}%
  2817.     \ifx\thirdarg\empty \else
  2818.       \toks0 = \expandafter{\the\toks0 \space #3}%
  2819.     \fi
  2820.     %
  2821.     \edef\writeto{\csname#1indfile\endcsname}%
  2822.     %
  2823.     \ifvmode
  2824.       \dosubindsanitize
  2825.     \else
  2826.       \dosubindwrite
  2827.     \fi
  2828.   \fi
  2829. % Write the entry in \toks0 to the index file:
  2830. \def\dosubindwrite{%
  2831.   % Put the index entry in the margin if desired.
  2832.   \ifx\SETmarginindex\relax\else
  2833.     \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
  2834.   \fi
  2835.   % Remember, we are within a group.
  2836.   \indexdummies % Must do this here, since \bf, etc expand at this stage
  2837.   \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
  2838.       % so it will be output as is; and it will print as backslash.
  2839.   % Process the index entry with all font commands turned off, to
  2840.   % get the string to sort by.
  2841.   {\indexnofonts
  2842.    \edef\temp{\the\toks0}% need full expansion
  2843.    \xdef\indexsorttmp{\temp}%
  2844.   % Set up the complete index entry, with both the sort key and
  2845.   % the original text, including any font commands.  We write
  2846.   % three arguments to \entry to the .?? file (four in the
  2847.   % subentry case), texindex reduces to two when writing the .??s
  2848.   % sorted result.
  2849.   \edef\temp{%
  2850.     \write\writeto{%
  2851.       \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
  2852.   \temp
  2853. % Take care of unwanted page breaks:
  2854. % If a skip is the last thing on the list now, preserve it
  2855. % by backing up by \lastskip, doing the \write, then inserting
  2856. % the skip again.  Otherwise, the whatsit generated by the
  2857. % \write will make \lastskip zero.  The result is that sequences
  2858. % like this:
  2859. % @end defun
  2860. % @tindex whatever
  2861. % @defun ...
  2862. % will have extra space inserted, because the \medbreak in the
  2863. % start of the @defun won't see the skip inserted by the @end of
  2864. % the previous defun.
  2865. % But don't do any of this if we're not in vertical mode.  We
  2866. % don't want to do a \vskip and prematurely end a paragraph.
  2867. % Avoid page breaks due to these extra skips, too.
  2868. % But wait, there is a catch there:
  2869. % We'll have to check whether \lastskip is zero skip.  \ifdim is not
  2870. % sufficient for this purpose, as it ignores stretch and shrink parts
  2871. % of the skip.  The only way seems to be to check the textual
  2872. % representation of the skip.
  2873. % The following is almost like \def\zeroskipmacro{0.0pt} except that
  2874. % the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
  2875. \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
  2876. % ..., ready, GO:
  2877. \def\dosubindsanitize{%
  2878.   % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
  2879.   \skip0 = \lastskip
  2880.   \edef\lastskipmacro{\the\lastskip}%
  2881.   \count255 = \lastpenalty
  2882.   % If \lastskip is nonzero, that means the last item was a
  2883.   % skip.  And since a skip is discardable, that means this
  2884.   % -\skip0 glue we're inserting is preceded by a
  2885.   % non-discardable item, therefore it is not a potential
  2886.   % breakpoint, therefore no \nobreak needed.
  2887.   \ifx\lastskipmacro\zeroskipmacro
  2888.   \else
  2889.     \vskip-\skip0
  2890.   \fi
  2891.   \dosubindwrite
  2892.   \ifx\lastskipmacro\zeroskipmacro
  2893.     % If \lastskip was zero, perhaps the last item was a penalty, and
  2894.     % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
  2895.     % to re-insert the same penalty (values >10000 are used for various
  2896.     % signals); since we just inserted a non-discardable item, any
  2897.     % following glue (such as a \parskip) would be a breakpoint.  For example:
  2898.     % 
  2899.     %   @deffn deffn-whatever
  2900.     %   @vindex index-whatever
  2901.     %   Description.
  2902.     % would allow a break between the index-whatever whatsit
  2903.     % and the "Description." paragraph.
  2904.     \ifnum\count255>9999 \penalty\count255 \fi
  2905.   \else
  2906.     % On the other hand, if we had a nonzero \lastskip,
  2907.     % this make-up glue would be preceded by a non-discardable item
  2908.     % (the whatsit from the \write), so we must insert a \nobreak.
  2909.     \nobreak\vskip\skip0
  2910.   \fi
  2911. % The index entry written in the file actually looks like
  2912. %  \entry {sortstring}{page}{topic}
  2913. %  \entry {sortstring}{page}{topic}{subtopic}
  2914. % The texindex program reads in these files and writes files
  2915. % containing these kinds of lines:
  2916. %  \initial {c}
  2917. %     before the first topic whose initial is c
  2918. %  \entry {topic}{pagelist}
  2919. %     for a topic that is used without subtopics
  2920. %  \primary {topic}
  2921. %     for the beginning of a topic that is used with subtopics
  2922. %  \secondary {subtopic}{pagelist}
  2923. %     for each subtopic.
  2924. % Define the user-accessible indexing commands
  2925. % @findex, @vindex, @kindex, @cindex.
  2926. \def\findex {\fnindex}
  2927. \def\kindex {\kyindex}
  2928. \def\cindex {\cpindex}
  2929. \def\vindex {\vrindex}
  2930. \def\tindex {\tpindex}
  2931. \def\pindex {\pgindex}
  2932. \def\cindexsub {\begingroup\obeylines\cindexsub}
  2933. {\obeylines %
  2934. \gdef\cindexsub "#1" #2^^M{\endgroup %
  2935. \dosubind{cp}{#2}{#1}}}
  2936. % Define the macros used in formatting output of the sorted index material.
  2937. % @printindex causes a particular index (the ??s file) to get printed.
  2938. % It does not print any chapter heading (usually an @unnumbered).
  2939. \parseargdef\printindex{\begingroup
  2940.   \dobreak \chapheadingskip{10000}%
  2941.   \smallfonts \rm
  2942.   \tolerance = 9500
  2943.   \everypar = {}% don't want the \kern\-parindent from indentation suppression.
  2944.   % See if the index file exists and is nonempty.
  2945.   % Change catcode of @ here so that if the index file contains
  2946.   % \initial {@}
  2947.   % as its first line, TeX doesn't complain about mismatched braces
  2948.   % (because it thinks @} is a control sequence).
  2949.   \catcode`\@ = 11
  2950.   \openin 1 \jobname.#1s
  2951.   \ifeof 1
  2952.     % \enddoublecolumns gets confused if there is no text in the index,
  2953.     % and it loses the chapter title and the aux file entries for the
  2954.     % index.  The easiest way to prevent this problem is to make sure
  2955.     % there is some text.
  2956.     \putwordIndexNonexistent
  2957.   \else
  2958.     %
  2959.     % If the index file exists but is empty, then \openin leaves \ifeof
  2960.     % false.  We have to make TeX try to read something from the file, so
  2961.     % it can discover if there is anything in it.
  2962.     \read 1 to \temp
  2963.     \ifeof 1
  2964.       \putwordIndexIsEmpty
  2965.     \else
  2966.       % Index files are almost Texinfo source, but we use \ as the escape
  2967.       % character.  It would be better to use @, but that's too big a change
  2968.       % to make right now.
  2969.       \def\indexbackslash{\backslashcurfont}%
  2970.       \catcode`\\ = 0
  2971.       \escapechar = `\\
  2972.       \begindoublecolumns
  2973.       \input \jobname.#1s
  2974.       \enddoublecolumns
  2975.     \fi
  2976.   \fi
  2977.   \closein 1
  2978. \endgroup}
  2979. % These macros are used by the sorted index file itself.
  2980. % Change them to control the appearance of the index.
  2981. \def\initial#1{{%
  2982.   % Some minor font changes for the special characters.
  2983.   \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
  2984.   % Remove any glue we may have, we'll be inserting our own.
  2985.   \removelastskip
  2986.   % We like breaks before the index initials, so insert a bonus.
  2987.   \nobreak
  2988.   \vskip 0pt plus 3\baselineskip
  2989.   \penalty 0
  2990.   \vskip 0pt plus -3\baselineskip
  2991.   % Typeset the initial.  Making this add up to a whole number of
  2992.   % baselineskips increases the chance of the dots lining up from column
  2993.   % to column.  It still won't often be perfect, because of the stretch
  2994.   % we need before each entry, but it's better.
  2995.   % No shrink because it confuses \balancecolumns.
  2996.   \vskip 1.67\baselineskip plus .5\baselineskip
  2997.   \leftline{\secbf #1}%
  2998.   % Do our best not to break after the initial.
  2999.   \nobreak
  3000.   \vskip .33\baselineskip plus .1\baselineskip
  3001. % \entry typesets a paragraph consisting of the text (#1), dot leaders, and
  3002. % then page number (#2) flushed to the right margin.  It is used for index
  3003. % and table of contents entries.  The paragraph is indented by \leftskip.
  3004. % A straightforward implementation would start like this:
  3005. %    \def\entry#1#2{...
  3006. % But this frozes the catcodes in the argument, and can cause problems to
  3007. % @code, which sets - active.  This problem was fixed by a kludge---
  3008. % ``-'' was active throughout whole index, but this isn't really right.
  3009. % The right solution is to prevent \entry from swallowing the whole text.
  3010. %                                 --kasal, 21nov03
  3011. \def\entry{%
  3012.   \begingroup
  3013.     %
  3014.     % Start a new paragraph if necessary, so our assignments below can't
  3015.     % affect previous text.
  3016.     \par
  3017.     %
  3018.     % Do not fill out the last line with white space.
  3019.     \parfillskip = 0in
  3020.     %
  3021.     % No extra space above this paragraph.
  3022.     \parskip = 0in
  3023.     %
  3024.     % Do not prefer a separate line ending with a hyphen to fewer lines.
  3025.     \finalhyphendemerits = 0
  3026.     %
  3027.     % \hangindent is only relevant when the entry text and page number
  3028.     % don't both fit on one line.  In that case, bob suggests starting the
  3029.     % dots pretty far over on the line.  Unfortunately, a large
  3030.     % indentation looks wrong when the entry text itself is broken across
  3031.     % lines.  So we use a small indentation and put up with long leaders.
  3032.     %
  3033.     % \hangafter is reset to 1 (which is the value we want) at the start
  3034.     % of each paragraph, so we need not do anything with that.
  3035.     \hangindent = 2em
  3036.     %
  3037.     % When the entry text needs to be broken, just fill out the first line
  3038.     % with blank space.
  3039.     \rightskip = 0pt plus1fil
  3040.     %
  3041.     % A bit of stretch before each entry for the benefit of balancing
  3042.     % columns.
  3043.     \vskip 0pt plus1pt
  3044.     %
  3045.     % Swallow the left brace of the text (first parameter):
  3046.     \afterassignment\doentry
  3047.     \let\temp =
  3048. \def\doentry{%
  3049.     \bgroup % Instead of the swallowed brace.
  3050.       \noindent
  3051.       \aftergroup\finishentry
  3052.       % And now comes the text of the entry.
  3053. \def\finishentry#1{%
  3054.     % #1 is the page number.
  3055.     %
  3056.     % The following is kludged to not output a line of dots in the index if
  3057.     % there are no page numbers.  The next person who breaks this will be
  3058.     % cursed by a Unix daemon.
  3059.     \def\tempa{{\rm }}%
  3060.     \def\tempb{#1}%
  3061.     \edef\tempc{\tempa}%
  3062.     \edef\tempd{\tempb}%
  3063.     \ifx\tempc\tempd
  3064.       \ %
  3065.     \else
  3066.       %
  3067.       % If we must, put the page number on a line of its own, and fill out
  3068.       % this line with blank space.  (The \hfil is overwhelmed with the
  3069.       % fill leaders glue in \indexdotfill if the page number does fit.)
  3070.       \hfil\penalty50
  3071.       \null\nobreak\indexdotfill % Have leaders before the page number.
  3072.       %
  3073.       % The `\ ' here is removed by the implicit \unskip that TeX does as
  3074.       % part of (the primitive) \par.  Without it, a spurious underfull
  3075.       % \hbox ensues.
  3076.       \ifpdf
  3077.     \pdfgettoks#1.%
  3078.     \ \the\toksA
  3079.       \else
  3080.     \ #1%
  3081.       \fi
  3082.     \fi
  3083.     \par
  3084.   \endgroup
  3085. % Like \dotfill except takes at least 1 em.
  3086. \def\indexdotfill{\cleaders
  3087.   \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
  3088. \def\primary #1{\line{#1\hfil}}
  3089. \newskip\secondaryindent \secondaryindent=0.5cm
  3090. \def\secondary#1#2{{%
  3091.   \parfillskip=0in
  3092.   \parskip=0in
  3093.   \hangindent=1in
  3094.   \hangafter=1
  3095.   \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
  3096.   \ifpdf
  3097.     \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
  3098.   \else
  3099.     #2
  3100.   \fi
  3101.   \par
  3102. % Define two-column mode, which we use to typeset indexes.
  3103. % Adapted from the TeXbook, page 416, which is to say,
  3104. % the manmac.tex format used to print the TeXbook itself.
  3105. \catcode`\@=11
  3106. \newbox\partialpage
  3107. \newdimen\doublecolumnhsize
  3108. \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
  3109.   % Grab any single-column material above us.
  3110.   \output = {%
  3111.     %
  3112.     % Here is a possibility not foreseen in manmac: if we accumulate a
  3113.     % whole lot of material, we might end up calling this \output
  3114.     % routine twice in a row (see the doublecol-lose test, which is
  3115.     % essentially a couple of indexes with @setchapternewpage off).  In
  3116.     % that case we just ship out what is in \partialpage with the normal
  3117.     % output routine.  Generally, \partialpage will be empty when this
  3118.     % runs and this will be a no-op.  See the indexspread.tex test case.
  3119.     \ifvoid\partialpage \else
  3120.       \onepageout{\pagecontents\partialpage}%
  3121.     \fi
  3122.     %
  3123.     \global\setbox\partialpage = \vbox{%
  3124.       % Unvbox the main output page.
  3125.       \unvbox\PAGE
  3126.       \kern-\topskip \kern\baselineskip
  3127.     }%
  3128.   \eject % run that output routine to set \partialpage
  3129.   % Use the double-column output routine for subsequent pages.
  3130.   \output = {\doublecolumnout}%
  3131.   % Change the page size parameters.  We could do this once outside this
  3132.   % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
  3133.   % format, but then we repeat the same computation.  Repeating a couple
  3134.   % of assignments once per index is clearly meaningless for the
  3135.   % execution time, so we may as well do it in one place.
  3136.   % First we halve the line length, less a little for the gutter between
  3137.   % the columns.  We compute the gutter based on the line length, so it
  3138.   % changes automatically with the paper format.  The magic constant
  3139.   % below is chosen so that the gutter has the same value (well, +-<1pt)
  3140.   % as it did when we hard-coded it.
  3141.   % We put the result in a separate register, \doublecolumhsize, so we
  3142.   % can restore it in \pagesofar, after \hsize itself has (potentially)
  3143.   % been clobbered.
  3144.   \doublecolumnhsize = \hsize
  3145.     \advance\doublecolumnhsize by -.04154\hsize
  3146.     \divide\doublecolumnhsize by 2
  3147.   \hsize = \doublecolumnhsize
  3148.   % Double the \vsize as well.  (We don't need a separate register here,
  3149.   % since nobody clobbers \vsize.)
  3150.   \vsize = 2\vsize
  3151. % The double-column output routine for all double-column pages except
  3152. % the last.
  3153. \def\doublecolumnout{%
  3154.   \splittopskip=\topskip \splitmaxdepth=\maxdepth
  3155.   % Get the available space for the double columns -- the normal
  3156.   % (undoubled) page height minus any material left over from the
  3157.   % previous page.
  3158.   \dimen@ = \vsize
  3159.   \divide\dimen@ by 2
  3160.   \advance\dimen@ by -\ht\partialpage
  3161.   % box0 will be the left-hand column, box2 the right.
  3162.   \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
  3163.   \onepageout\pagesofar
  3164.   \unvbox255
  3165.   \penalty\outputpenalty
  3166. % Re-output the contents of the output page -- any previous material,
  3167. % followed by the two boxes we just split, in box0 and box2.
  3168. \def\pagesofar{%
  3169.   \unvbox\partialpage
  3170.   \hsize = \doublecolumnhsize
  3171.   \wd0=\hsize \wd2=\hsize
  3172.   \hbox to\pagewidth{\box0\hfil\box2}%
  3173. % All done with double columns.
  3174. \def\enddoublecolumns{%
  3175.   \output = {%
  3176.     % Split the last of the double-column material.  Leave it on the
  3177.     % current page, no automatic page break.
  3178.     \balancecolumns
  3179.     %
  3180.     % If we end up splitting too much material for the current page,
  3181.     % though, there will be another page break right after this \output
  3182.     % invocation ends.  Having called \balancecolumns once, we do not
  3183.     % want to call it again.  Therefore, reset \output to its normal
  3184.     % definition right away.  (We hope \balancecolumns will never be
  3185.     % called on to balance too much material, but if it is, this makes
  3186.     % the output somewhat more palatable.)
  3187.     \global\output = {\onepageout{\pagecontents\PAGE}}%
  3188.   \eject
  3189.   \endgroup % started in \begindoublecolumns
  3190.   % \pagegoal was set to the doubled \vsize above, since we restarted
  3191.   % the current page.  We're now back to normal single-column
  3192.   % typesetting, so reset \pagegoal to the normal \vsize (after the
  3193.   % \endgroup where \vsize got restored).
  3194.   \pagegoal = \vsize
  3195. % Called at the end of the double column material.
  3196. \def\balancecolumns{%
  3197.   \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
  3198.   \dimen@ = \ht0
  3199.   \advance\dimen@ by \topskip
  3200.   \advance\dimen@ by-\baselineskip
  3201.   \divide\dimen@ by 2 % target to split to
  3202.   %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
  3203.   \splittopskip = \topskip
  3204.   % Loop until we get a decent breakpoint.
  3205.     \vbadness = 10000
  3206.     \loop
  3207.       \global\setbox3 = \copy0
  3208.       \global\setbox1 = \vsplit3 to \dimen@
  3209.     \ifdim\ht3>\dimen@
  3210.       \global\advance\dimen@ by 1pt
  3211.     \repeat
  3212.   %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
  3213.   \setbox0=\vbox to\dimen@{\unvbox1}%
  3214.   \setbox2=\vbox to\dimen@{\unvbox3}%
  3215.   \pagesofar
  3216. \catcode`\@ = \other
  3217. \message{sectioning,}
  3218. % Chapters, sections, etc.
  3219. % \unnumberedno is an oxymoron, of course.  But we count the unnumbered
  3220. % sections so that we can refer to them unambiguously in the pdf
  3221. % outlines by their "section number".  We avoid collisions with chapter
  3222. % numbers by starting them at 10000.  (If a document ever has 10000
  3223. % chapters, we're in trouble anyway, I'm sure.)
  3224. \newcount\unnumberedno \unnumberedno = 10000
  3225. \newcount\chapno
  3226. \newcount\secno        \secno=0
  3227. \newcount\subsecno     \subsecno=0
  3228. \newcount\subsubsecno  \subsubsecno=0
  3229. % This counter is funny since it counts through charcodes of letters A, B, ...
  3230. \newcount\appendixno  \appendixno = `\@
  3231. % \def\appendixletter{\char\the\appendixno}
  3232. % We do the following ugly conditional instead of the above simple
  3233. % construct for the sake of pdftex, which needs the actual
  3234. % letter in the expansion, not just typeset.
  3235. \def\appendixletter{%
  3236.   \ifnum\appendixno=`A A%
  3237.   \else\ifnum\appendixno=`B B%
  3238.   \else\ifnum\appendixno=`C C%
  3239.   \else\ifnum\appendixno=`D D%
  3240.   \else\ifnum\appendixno=`E E%
  3241.   \else\ifnum\appendixno=`F F%
  3242.   \else\ifnum\appendixno=`G G%
  3243.   \else\ifnum\appendixno=`H H%
  3244.   \else\ifnum\appendixno=`I I%
  3245.   \else\ifnum\appendixno=`J J%
  3246.   \else\ifnum\appendixno=`K K%
  3247.   \else\ifnum\appendixno=`L L%
  3248.   \else\ifnum\appendixno=`M M%
  3249.   \else\ifnum\appendixno=`N N%
  3250.   \else\ifnum\appendixno=`O O%
  3251.   \else\ifnum\appendixno=`P P%
  3252.   \else\ifnum\appendixno=`Q Q%
  3253.   \else\ifnum\appendixno=`R R%
  3254.   \else\ifnum\appendixno=`S S%
  3255.   \else\ifnum\appendixno=`T T%
  3256.   \else\ifnum\appendixno=`U U%
  3257.   \else\ifnum\appendixno=`V V%
  3258.   \else\ifnum\appendixno=`W W%
  3259.   \else\ifnum\appendixno=`X X%
  3260.   \else\ifnum\appendixno=`Y Y%
  3261.   \else\ifnum\appendixno=`Z Z%
  3262.   % The \the is necessary, despite appearances, because \appendixletter is
  3263.   % expanded while writing the .toc file.  \char\appendixno is not
  3264.   % expandable, thus it is written literally, thus all appendixes come out
  3265.   % with the same letter (or @) in the toc without it.
  3266.   \else\char\the\appendixno
  3267.   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
  3268.   \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
  3269. % Each @chapter defines this as the name of the chapter.
  3270. % page headings and footings can use it.  @section does likewise.
  3271. % However, they are not reliable, because we don't use marks.
  3272. \def\thischapter{}
  3273. \def\thissection{}
  3274. \newcount\absseclevel % used to calculate proper heading level
  3275. \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
  3276. % @raisesections: treat @section as chapter, @subsection as section, etc.
  3277. \def\raisesections{\global\advance\secbase by -1}
  3278. \let\up=\raisesections % original BFox name
  3279. % @lowersections: treat @chapter as section, @section as subsection, etc.
  3280. \def\lowersections{\global\advance\secbase by 1}
  3281. \let\down=\lowersections % original BFox name
  3282. % we only have subsub.
  3283. \chardef\maxseclevel = 3
  3284. % A numbered section within an unnumbered changes to unnumbered too.
  3285. % To achive this, remember the "biggest" unnum. sec. we are currently in:
  3286. \chardef\unmlevel = \maxseclevel
  3287. % Trace whether the current chapter is an appendix or not:
  3288. % \chapheadtype is "N" or "A", unnumbered chapters are ignored.
  3289. \def\chapheadtype{N}
  3290. % Choose a heading macro
  3291. % #1 is heading type
  3292. % #2 is heading level
  3293. % #3 is text for heading
  3294. \def\genhead#1#2#3{%
  3295.   % Compute the abs. sec. level:
  3296.   \absseclevel=#2
  3297.   \advance\absseclevel by \secbase
  3298.   % Make sure \absseclevel doesn't fall outside the range:
  3299.   \ifnum \absseclevel < 0
  3300.     \absseclevel = 0
  3301.   \else
  3302.     \ifnum \absseclevel > 3
  3303.       \absseclevel = 3
  3304.     \fi
  3305.   \fi
  3306.   % The heading type:
  3307.   \def\headtype{#1}%
  3308.   \if \headtype U%
  3309.     \ifnum \absseclevel < \unmlevel
  3310.       \chardef\unmlevel = \absseclevel
  3311.     \fi
  3312.   \else
  3313.     % Check for appendix sections:
  3314.     \ifnum \absseclevel = 0
  3315.       \edef\chapheadtype{\headtype}%
  3316.     \else
  3317.       \if \headtype A\if \chapheadtype N%
  3318.     \errmessage{@appendix... within a non-appendix chapter}%
  3319.       \fi\fi
  3320.     \fi
  3321.     % Check for numbered within unnumbered:
  3322.     \ifnum \absseclevel > \unmlevel
  3323.       \def\headtype{U}%
  3324.     \else
  3325.       \chardef\unmlevel = 3
  3326.     \fi
  3327.   \fi
  3328.   % Now print the heading:
  3329.   \if \headtype U%
  3330.     \ifcase\absseclevel
  3331.     \unnumberedzzz{#3}%
  3332.     \or \unnumberedseczzz{#3}%
  3333.     \or \unnumberedsubseczzz{#3}%
  3334.     \or \unnumberedsubsubseczzz{#3}%
  3335.     \fi
  3336.   \else
  3337.     \if \headtype A%
  3338.       \ifcase\absseclevel
  3339.       \appendixzzz{#3}%
  3340.       \or \appendixsectionzzz{#3}%
  3341.       \or \appendixsubseczzz{#3}%
  3342.       \or \appendixsubsubseczzz{#3}%
  3343.       \fi
  3344.     \else
  3345.       \ifcase\absseclevel
  3346.       \chapterzzz{#3}%
  3347.       \or \seczzz{#3}%
  3348.       \or \numberedsubseczzz{#3}%
  3349.       \or \numberedsubsubseczzz{#3}%
  3350.       \fi
  3351.     \fi
  3352.   \fi
  3353.   \suppressfirstparagraphindent
  3354. % an interface:
  3355. \def\numhead{\genhead N}
  3356. \def\apphead{\genhead A}
  3357. \def\unnmhead{\genhead U}
  3358. % @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
  3359. % all lower-level sectioning counters to zero.
  3360. % Also set \chaplevelprefix, which we prepend to @float sequence numbers
  3361. % (e.g., figures), q.v.  By default (before any chapter), that is empty.
  3362. \let\chaplevelprefix = \empty
  3363. \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
  3364. \def\chapterzzz#1{%
  3365.   % section resetting is \global in case the chapter is in a group, such
  3366.   % as an @include file.
  3367.   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
  3368.     \global\advance\chapno by 1
  3369.   % Used for \float.
  3370.   \gdef\chaplevelprefix{\the\chapno.}%
  3371.   \resetallfloatnos
  3372.   \message{\putwordChapter\space \the\chapno}%
  3373.   % Write the actual heading.
  3374.   \chapmacro{#1}{Ynumbered}{\the\chapno}%
  3375.   % So @section and the like are numbered underneath this chapter.
  3376.   \global\let\section = \numberedsec
  3377.   \global\let\subsection = \numberedsubsec
  3378.   \global\let\subsubsection = \numberedsubsubsec
  3379. \outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
  3380. \def\appendixzzz#1{%
  3381.   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
  3382.     \global\advance\appendixno by 1
  3383.   \gdef\chaplevelprefix{\appendixletter.}%
  3384.   \resetallfloatnos
  3385.   \def\appendixnum{\putwordAppendix\space \appendixletter}%
  3386.   \message{\appendixnum}%
  3387.   \chapmacro{#1}{Yappendix}{\appendixletter}%
  3388.   \global\let\section = \appendixsec
  3389.   \global\let\subsection = \appendixsubsec
  3390.   \global\let\subsubsection = \appendixsubsubsec
  3391. \outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
  3392. \def\unnumberedzzz#1{%
  3393.   \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
  3394.     \global\advance\unnumberedno by 1
  3395.   % Since an unnumbered has no number, no prefix for figures.
  3396.   \global\let\chaplevelprefix = \empty
  3397.   \resetallfloatnos
  3398.   % This used to be simply \message{#1}, but TeX fully expands the
  3399.   % argument to \message.  Therefore, if #1 contained @-commands, TeX
  3400.   % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
  3401.   % expanded @cite (which turns out to cause errors because \cite is meant
  3402.   % to be executed, not expanded).
  3403.   % Anyway, we don't want the fully-expanded definition of @cite to appear
  3404.   % as a result of the \message, we just want `@cite' itself.  We use
  3405.   % \the<toks register> to achieve this: TeX expands \the<toks> only once,
  3406.   % simply yielding the contents of <toks register>.  (We also do this for
  3407.   % the toc entries.)
  3408.   \toks0 = {#1}%
  3409.   \message{(\the\toks0)}%
  3410.   \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
  3411.   \global\let\section = \unnumberedsec
  3412.   \global\let\subsection = \unnumberedsubsec
  3413.   \global\let\subsubsection = \unnumberedsubsubsec
  3414. % @centerchap is like @unnumbered, but the heading is centered.
  3415. \outer\parseargdef\centerchap{%
  3416.   % Well, we could do the following in a group, but that would break
  3417.   % an assumption that \chapmacro is called at the outermost level.
  3418.   % Thus we are safer this way:        --kasal, 24feb04
  3419.   \let\centerparametersmaybe = \centerparameters
  3420.   \unnmhead0{#1}%
  3421.   \let\centerparametersmaybe = \relax
  3422. % @top is like @unnumbered.
  3423. \let\top\unnumbered
  3424. % Sections.
  3425. \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
  3426. \def\seczzz#1{%
  3427.   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
  3428.   \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
  3429. \outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
  3430. \def\appendixsectionzzz#1{%
  3431.   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
  3432.   \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
  3433. \let\appendixsec\appendixsection
  3434. \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
  3435. \def\unnumberedseczzz#1{%
  3436.   \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
  3437.   \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
  3438. % Subsections.
  3439. \outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
  3440. \def\numberedsubseczzz#1{%
  3441.   \global\subsubsecno=0  \global\advance\subsecno by 1
  3442.   \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
  3443. \outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
  3444. \def\appendixsubseczzz#1{%
  3445.   \global\subsubsecno=0  \global\advance\subsecno by 1
  3446.   \sectionheading{#1}{subsec}{Yappendix}%
  3447.                  {\appendixletter.\the\secno.\the\subsecno}%
  3448. \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
  3449. \def\unnumberedsubseczzz#1{%
  3450.   \global\subsubsecno=0  \global\advance\subsecno by 1
  3451.   \sectionheading{#1}{subsec}{Ynothing}%
  3452.                  {\the\unnumberedno.\the\secno.\the\subsecno}%
  3453. % Subsubsections.
  3454. \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
  3455. \def\numberedsubsubseczzz#1{%
  3456.   \global\advance\subsubsecno by 1
  3457.   \sectionheading{#1}{subsubsec}{Ynumbered}%
  3458.                  {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
  3459. \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
  3460. \def\appendixsubsubseczzz#1{%
  3461.   \global\advance\subsubsecno by 1
  3462.   \sectionheading{#1}{subsubsec}{Yappendix}%
  3463.                  {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
  3464. \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
  3465. \def\unnumberedsubsubseczzz#1{%
  3466.   \global\advance\subsubsecno by 1
  3467.   \sectionheading{#1}{subsubsec}{Ynothing}%
  3468.                  {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
  3469. % These macros control what the section commands do, according
  3470. % to what kind of chapter we are in (ordinary, appendix, or unnumbered).
  3471. % Define them by default for a numbered chapter.
  3472. \let\section = \numberedsec
  3473. \let\subsection = \numberedsubsec
  3474. \let\subsubsection = \numberedsubsubsec
  3475. % Define @majorheading, @heading and @subheading
  3476. % NOTE on use of \vbox for chapter headings, section headings, and such:
  3477. %       1) We use \vbox rather than the earlier \line to permit
  3478. %          overlong headings to fold.
  3479. %       2) \hyphenpenalty is set to 10000 because hyphenation in a
  3480. %          heading is obnoxious; this forbids it.
  3481. %       3) Likewise, headings look best if no \parindent is used, and
  3482. %          if justification is not attempted.  Hence \raggedright.
  3483. \def\majorheading{%
  3484.   {\advance\chapheadingskip by 10pt \chapbreak }%
  3485.   \parsearg\chapheadingzzz
  3486. \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
  3487. \def\chapheadingzzz#1{%
  3488.   {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
  3489.                     \parindent=0pt\raggedright
  3490.                     \rm #1\hfill}}%
  3491.   \bigskip \par\penalty 200\relax
  3492.   \suppressfirstparagraphindent
  3493. % @heading, @subheading, @subsubheading.
  3494. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
  3495.   \suppressfirstparagraphindent}
  3496. \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
  3497.   \suppressfirstparagraphindent}
  3498. \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
  3499.   \suppressfirstparagraphindent}
  3500. % These macros generate a chapter, section, etc. heading only
  3501. % (including whitespace, linebreaking, etc. around it),
  3502. % given all the information in convenient, parsed form.
  3503. %%% Args are the skip and penalty (usually negative)
  3504. \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
  3505. %%% Define plain chapter starts, and page on/off switching for it
  3506. % Parameter controlling skip before chapter headings (if needed)
  3507. \newskip\chapheadingskip
  3508. \def\chapbreak{\dobreak \chapheadingskip {-4000}}
  3509. \def\chappager{\par\vfill\supereject}
  3510. \def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
  3511. \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
  3512. \def\CHAPPAGoff{%
  3513. \global\let\contentsalignmacro = \chappager
  3514. \global\let\pchapsepmacro=\chapbreak
  3515. \global\let\pagealignmacro=\chappager}
  3516. \def\CHAPPAGon{%
  3517. \global\let\contentsalignmacro = \chappager
  3518. \global\let\pchapsepmacro=\chappager
  3519. \global\let\pagealignmacro=\chappager
  3520. \global\def\HEADINGSon{\HEADINGSsingle}}
  3521. \def\CHAPPAGodd{%
  3522. \global\let\contentsalignmacro = \chapoddpage
  3523. \global\let\pchapsepmacro=\chapoddpage
  3524. \global\let\pagealignmacro=\chapoddpage
  3525. \global\def\HEADINGSon{\HEADINGSdouble}}
  3526. \CHAPPAGon
  3527. % Chapter opening.
  3528. % #1 is the text, #2 is the section type (Ynumbered, Ynothing,
  3529. % Yappendix, Yomitfromtoc), #3 the chapter number.
  3530. % To test against our argument.
  3531. \def\Ynothingkeyword{Ynothing}
  3532. \def\Yomitfromtockeyword{Yomitfromtoc}
  3533. \def\Yappendixkeyword{Yappendix}
  3534. \def\chapmacro#1#2#3{%
  3535.   \pchapsepmacro
  3536.     \chapfonts \rm
  3537.     %
  3538.     % Have to define \thissection before calling \donoderef, because the
  3539.     % xref code eventually uses it.  On the other hand, it has to be called
  3540.     % after \pchapsepmacro, or the headline will change too soon.
  3541.     \gdef\thissection{#1}%
  3542.     \gdef\thischaptername{#1}%
  3543.     %
  3544.     % Only insert the separating space if we have a chapter/appendix
  3545.     % number, and don't print the unnumbered ``number''.
  3546.     \def\temptype{#2}%
  3547.     \ifx\temptype\Ynothingkeyword
  3548.       \setbox0 = \hbox{}%
  3549.       \def\toctype{unnchap}%
  3550.       \gdef\thischapter{#1}%
  3551.     \else\ifx\temptype\Yomitfromtockeyword
  3552.       \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
  3553.       \def\toctype{omit}%
  3554.       \gdef\thischapter{}%
  3555.     \else\ifx\temptype\Yappendixkeyword
  3556.       \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
  3557.       \def\toctype{app}%
  3558.       % We don't substitute the actual chapter name into \thischapter
  3559.       % because we don't want its macros evaluated now.  And we don't
  3560.       % use \thissection because that changes with each section.
  3561.       %
  3562.       \xdef\thischapter{\putwordAppendix{} \appendixletter:
  3563.                         \noexpand\thischaptername}%
  3564.     \else
  3565.       \setbox0 = \hbox{#3\enspace}%
  3566.       \def\toctype{numchap}%
  3567.       \xdef\thischapter{\putwordChapter{} \the\chapno:
  3568.                         \noexpand\thischaptername}%
  3569.     \fi\fi\fi
  3570.     %
  3571.     % Write the toc entry for this chapter.  Must come before the
  3572.     % \donoderef, because we include the current node name in the toc
  3573.     % entry, and \donoderef resets it to empty.
  3574.     \writetocentry{\toctype}{#1}{#3}%
  3575.     %
  3576.     % For pdftex, we have to write out the node definition (aka, make
  3577.     % the pdfdest) after any page break, but before the actual text has
  3578.     % been typeset.  If the destination for the pdf outline is after the
  3579.     % text, then jumping from the outline may wind up with the text not
  3580.     % being visible, for instance under high magnification.
  3581.     \donoderef{#2}%
  3582.     %
  3583.     % Typeset the actual heading.
  3584.     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
  3585.           \hangindent=\wd0 \centerparametersmaybe
  3586.           \unhbox0 #1\par}%
  3587.   \nobreak\bigskip % no page break after a chapter title
  3588.   \nobreak
  3589. % @centerchap -- centered and unnumbered.
  3590. \let\centerparametersmaybe = \relax
  3591. \def\centerparameters{%
  3592.   \advance\rightskip by 3\rightskip
  3593.   \leftskip = \rightskip
  3594.   \parfillskip = 0pt
  3595. % I don't think this chapter style is supported any more, so I'm not
  3596. % updating it with the new noderef stuff.  We'll see.  --karl, 11aug03.
  3597. \def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
  3598. \def\unnchfopen #1{%
  3599. \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
  3600.                        \parindent=0pt\raggedright
  3601.                        \rm #1\hfill}}\bigskip \par\nobreak
  3602. \def\chfopen #1#2{\chapoddpage {\chapfonts
  3603. \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
  3604. \par\penalty 5000 %
  3605. \def\centerchfopen #1{%
  3606. \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
  3607.                        \parindent=0pt
  3608.                        \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
  3609. \def\CHAPFopen{%
  3610.   \global\let\chapmacro=\chfopen
  3611.   \global\let\centerchapmacro=\centerchfopen}
  3612. % Section titles.  These macros combine the section number parts and
  3613. % call the generic \sectionheading to do the printing.
  3614. \newskip\secheadingskip
  3615. \def\secheadingbreak{\dobreak \secheadingskip{-1000}}
  3616. % Subsection titles.
  3617. \newskip\subsecheadingskip
  3618. \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
  3619. % Subsubsection titles.
  3620. \def\subsubsecheadingskip{\subsecheadingskip}
  3621. \def\subsubsecheadingbreak{\subsecheadingbreak}
  3622. % Print any size, any type, section title.
  3623. % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
  3624. % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
  3625. % section number.
  3626. \def\sectionheading#1#2#3#4{%
  3627.     % Switch to the right set of fonts.
  3628.     \csname #2fonts\endcsname \rm
  3629.     %
  3630.     % Insert space above the heading.
  3631.     \csname #2headingbreak\endcsname
  3632.     %
  3633.     % Only insert the space after the number if we have a section number.
  3634.     \def\sectionlevel{#2}%
  3635.     \def\temptype{#3}%
  3636.     %
  3637.     \ifx\temptype\Ynothingkeyword
  3638.       \setbox0 = \hbox{}%
  3639.       \def\toctype{unn}%
  3640.       \gdef\thissection{#1}%
  3641.     \else\ifx\temptype\Yomitfromtockeyword
  3642.       % for @headings -- no section number, don't include in toc,
  3643.       % and don't redefine \thissection.
  3644.       \setbox0 = \hbox{}%
  3645.       \def\toctype{omit}%
  3646.       \let\sectionlevel=\empty
  3647.     \else\ifx\temptype\Yappendixkeyword
  3648.       \setbox0 = \hbox{#4\enspace}%
  3649.       \def\toctype{app}%
  3650.       \gdef\thissection{#1}%
  3651.     \else
  3652.       \setbox0 = \hbox{#4\enspace}%
  3653.       \def\toctype{num}%
  3654.       \gdef\thissection{#1}%
  3655.     \fi\fi\fi
  3656.     %
  3657.     % Write the toc entry (before \donoderef).  See comments in \chfplain.
  3658.     \writetocentry{\toctype\sectionlevel}{#1}{#4}%
  3659.     %
  3660.     % Write the node reference (= pdf destination for pdftex).
  3661.     % Again, see comments in \chfplain.
  3662.     \donoderef{#3}%
  3663.     %
  3664.     % Output the actual section heading.
  3665.     \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
  3666.           \hangindent=\wd0  % zero if no section number
  3667.           \unhbox0 #1}%
  3668.   % Add extra space after the heading -- half of whatever came above it.
  3669.   % Don't allow stretch, though.
  3670.   \kern .5 \csname #2headingskip\endcsname
  3671.   % Do not let the kern be a potential breakpoint, as it would be if it
  3672.   % was followed by glue.
  3673.   \nobreak
  3674.   % We'll almost certainly start a paragraph next, so don't let that
  3675.   % glue accumulate.  (Not a breakpoint because it's preceded by a
  3676.   % discardable item.)
  3677.   \vskip-\parskip
  3678.   % This is purely so the last item on the list is a known \penalty >
  3679.   % 10000.  This is so \startdefun can avoid allowing breakpoints after
  3680.   % section headings.  Otherwise, it would insert a valid breakpoint between:
  3681.   %   @section sec-whatever
  3682.   %   @deffn def-whatever
  3683.   \penalty 10001
  3684. \message{toc,}
  3685. % Table of contents.
  3686. \newwrite\tocfile
  3687. % Write an entry to the toc file, opening it if necessary.
  3688. % Called from @chapter, etc.
  3689. % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
  3690. % We append the current node name (if any) and page number as additional
  3691. % arguments for the \{chap,sec,...}entry macros which will eventually
  3692. % read this.  The node name is used in the pdf outlines as the
  3693. % destination to jump to.
  3694. % We open the .toc file for writing here instead of at @setfilename (or
  3695. % any other fixed time) so that @contents can be anywhere in the document.
  3696. % But if #1 is `omit', then we don't do anything.  This is used for the
  3697. % table of contents chapter openings themselves.
  3698. \newif\iftocfileopened
  3699. \def\omitkeyword{omit}%
  3700. \def\writetocentry#1#2#3{%
  3701.   \edef\writetoctype{#1}%
  3702.   \ifx\writetoctype\omitkeyword \else
  3703.     \iftocfileopened\else
  3704.       \immediate\openout\tocfile = \jobname.toc
  3705.       \global\tocfileopenedtrue
  3706.     \fi
  3707.     %
  3708.     \iflinks
  3709.       {\atdummies
  3710.        \edef\temp{%
  3711.          \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
  3712.        \temp
  3713.       }
  3714.     \fi
  3715.   \fi
  3716.   % Tell \shipout to create a pdf destination on each page, if we're
  3717.   % writing pdf.  These are used in the table of contents.  We can't
  3718.   % just write one on every page because the title pages are numbered
  3719.   % 1 and 2 (the page numbers aren't printed), and so are the first
  3720.   % two pages of the document.  Thus, we'd have two destinations named
  3721.   % `1', and two named `2'.
  3722.   \ifpdf \global\pdfmakepagedesttrue \fi
  3723. % These characters do not print properly in the Computer Modern roman
  3724. % fonts, so we must take special care.  This is more or less redundant
  3725. % with the Texinfo input format setup at the end of this file.
  3726. \def\activecatcodes{%
  3727.   \catcode`\"=\active
  3728.   \catcode`\$=\active
  3729.   \catcode`\<=\active
  3730.   \catcode`\>=\active
  3731.   \catcode`\\=\active
  3732.   \catcode`\^=\active
  3733.   \catcode`\_=\active
  3734.   \catcode`\|=\active
  3735.   \catcode`\~=\active
  3736. % Read the toc file, which is essentially Texinfo input.
  3737. \def\readtocfile{%
  3738.   \setupdatafile
  3739.   \activecatcodes
  3740.   \input \jobname.toc
  3741. \newskip\contentsrightmargin \contentsrightmargin=1in
  3742. \newcount\savepageno
  3743. \newcount\lastnegativepageno \lastnegativepageno = -1
  3744. % Prepare to read what we've written to \tocfile.
  3745. \def\startcontents#1{%
  3746.   % If @setchapternewpage on, and @headings double, the contents should
  3747.   % start on an odd page, unlike chapters.  Thus, we maintain
  3748.   % \contentsalignmacro in parallel with \pagealignmacro.
  3749.   % From: Torbjorn Granlund <tege@matematik.su.se>
  3750.   \contentsalignmacro
  3751.   \immediate\closeout\tocfile
  3752.   % Don't need to put `Contents' or `Short Contents' in the headline.
  3753.   % It is abundantly clear what they are.
  3754.   \def\thischapter{}%
  3755.   \chapmacro{#1}{Yomitfromtoc}{}%
  3756.   \savepageno = \pageno
  3757.   \begingroup                  % Set up to handle contents files properly.
  3758.     \raggedbottom              % Worry more about breakpoints than the bottom.
  3759.     \advance\hsize by -\contentsrightmargin % Don't use the full line length.
  3760.     %
  3761.     % Roman numerals for page numbers.
  3762.     \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
  3763. % Normal (long) toc.
  3764. \def\contents{%
  3765.   \startcontents{\putwordTOC}%
  3766.     \openin 1 \jobname.toc
  3767.     \ifeof 1 \else
  3768.       \readtocfile
  3769.     \fi
  3770.     \vfill \eject
  3771.     \contentsalignmacro % in case @setchapternewpage odd is in effect
  3772.     \ifeof 1 \else
  3773.       \pdfmakeoutlines
  3774.     \fi
  3775.     \closein 1
  3776.   \endgroup
  3777.   \lastnegativepageno = \pageno
  3778.   \global\pageno = \savepageno
  3779. % And just the chapters.
  3780. \def\summarycontents{%
  3781.   \startcontents{\putwordShortTOC}%
  3782.     %
  3783.     \let\numchapentry = \shortchapentry
  3784.     \let\appentry = \shortchapentry
  3785.     \let\unnchapentry = \shortunnchapentry
  3786.     % We want a true roman here for the page numbers.
  3787.     \secfonts
  3788.     \let\rm=\shortcontrm \let\bf=\shortcontbf
  3789.     \let\sl=\shortcontsl \let\tt=\shortconttt
  3790.     \rm
  3791.     \hyphenpenalty = 10000
  3792.     \advance\baselineskip by 1pt % Open it up a little.
  3793.     \def\numsecentry##1##2##3##4{}
  3794.     \let\appsecentry = \numsecentry
  3795.     \let\unnsecentry = \numsecentry
  3796.     \let\numsubsecentry = \numsecentry
  3797.     \let\appsubsecentry = \numsecentry
  3798.     \let\unnsubsecentry = \numsecentry
  3799.     \let\numsubsubsecentry = \numsecentry
  3800.     \let\appsubsubsecentry = \numsecentry
  3801.     \let\unnsubsubsecentry = \numsecentry
  3802.     \openin 1 \jobname.toc
  3803.     \ifeof 1 \else
  3804.       \readtocfile
  3805.     \fi
  3806.     \closein 1
  3807.     \vfill \eject
  3808.     \contentsalignmacro % in case @setchapternewpage odd is in effect
  3809.   \endgroup
  3810.   \lastnegativepageno = \pageno
  3811.   \global\pageno = \savepageno
  3812. \let\shortcontents = \summarycontents
  3813. % Typeset the label for a chapter or appendix for the short contents.
  3814. % The arg is, e.g., `A' for an appendix, or `3' for a chapter.
  3815. \def\shortchaplabel#1{%
  3816.   % This space should be enough, since a single number is .5em, and the
  3817.   % widest letter (M) is 1em, at least in the Computer Modern fonts.
  3818.   % But use \hss just in case.
  3819.   % (This space doesn't include the extra space that gets added after
  3820.   % the label; that gets put in by \shortchapentry above.)
  3821.   % We'd like to right-justify chapter numbers, but that looks strange
  3822.   % with appendix letters.  And right-justifying numbers and
  3823.   % left-justifying letters looks strange when there is less than 10
  3824.   % chapters.  Have to read the whole toc once to know how many chapters
  3825.   % there are before deciding ...
  3826.   \hbox to 1em{#1\hss}%
  3827. % These macros generate individual entries in the table of contents.
  3828. % The first argument is the chapter or section name.
  3829. % The last argument is the page number.
  3830. % The arguments in between are the chapter number, section number, ...
  3831. % Chapters, in the main contents.
  3832. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
  3833. % Chapters, in the short toc.
  3834. % See comments in \dochapentry re vbox and related settings.
  3835. \def\shortchapentry#1#2#3#4{%
  3836.   \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
  3837. % Appendices, in the main contents.
  3838. % Need the word Appendix, and a fixed-size box.
  3839. \def\appendixbox#1{%
  3840.   % We use M since it's probably the widest letter.
  3841.   \setbox0 = \hbox{\putwordAppendix{} M}%
  3842.   \hbox to \wd0{\putwordAppendix{} #1\hss}}
  3843. \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
  3844. % Unnumbered chapters.
  3845. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
  3846. \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
  3847. % Sections.
  3848. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
  3849. \let\appsecentry=\numsecentry
  3850. \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
  3851. % Subsections.
  3852. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
  3853. \let\appsubsecentry=\numsubsecentry
  3854. \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
  3855. % And subsubsections.
  3856. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
  3857. \let\appsubsubsecentry=\numsubsubsecentry
  3858. \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
  3859. % This parameter controls the indentation of the various levels.
  3860. % Same as \defaultparindent.
  3861. \newdimen\tocindent \tocindent = 15pt
  3862. % Now for the actual typesetting. In all these, #1 is the text and #2 is the
  3863. % page number.
  3864. % If the toc has to be broken over pages, we want it to be at chapters
  3865. % if at all possible; hence the \penalty.
  3866. \def\dochapentry#1#2{%
  3867.    \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
  3868.    \begingroup
  3869.      \chapentryfonts
  3870.      \tocentry{#1}{\dopageno\bgroup#2\egroup}%
  3871.    \endgroup
  3872.    \nobreak\vskip .25\baselineskip plus.1\baselineskip
  3873. \def\dosecentry#1#2{\begingroup
  3874.   \secentryfonts \leftskip=\tocindent
  3875.   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
  3876. \endgroup}
  3877. \def\dosubsecentry#1#2{\begingroup
  3878.   \subsecentryfonts \leftskip=2\tocindent
  3879.   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
  3880. \endgroup}
  3881. \def\dosubsubsecentry#1#2{\begingroup
  3882.   \subsubsecentryfonts \leftskip=3\tocindent
  3883.   \tocentry{#1}{\dopageno\bgroup#2\egroup}%
  3884. \endgroup}
  3885. % We use the same \entry macro as for the index entries.
  3886. \let\tocentry = \entry
  3887. % Space between chapter (or whatever) number and the title.
  3888. \def\labelspace{\hskip1em \relax}
  3889. \def\dopageno#1{{\rm #1}}
  3890. \def\doshortpageno#1{{\rm #1}}
  3891. \def\chapentryfonts{\secfonts \rm}
  3892. \def\secentryfonts{\textfonts}
  3893. \def\subsecentryfonts{\textfonts}
  3894. \def\subsubsecentryfonts{\textfonts}
  3895. \message{environments,}
  3896. % @foo ... @end foo.
  3897. % @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
  3898. % Since these characters are used in examples, it should be an even number of
  3899. % \tt widths. Each \tt character is 1en, so two makes it 1em.
  3900. \def\point{$\star$}
  3901. \def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
  3902. \def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
  3903. \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
  3904. \def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
  3905. % The @error{} command.
  3906. % Adapted from the TeXbook's \boxit.
  3907. \newbox\errorbox
  3908. {\tentt \global\dimen0 = 3em}% Width of the box.
  3909. \dimen2 = .55pt % Thickness of rules
  3910. % The text. (`r' is open on the right, `e' somewhat less so on the left.)
  3911. \setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
  3912. \setbox\errorbox=\hbox to \dimen0{\hfil
  3913.    \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
  3914.    \advance\hsize by -2\dimen2 % Rules.
  3915.    \vbox{%
  3916.       \hrule height\dimen2
  3917.       \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
  3918.          \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
  3919.          \kern3pt\vrule width\dimen2}% Space to right.
  3920.       \hrule height\dimen2}
  3921.     \hfil}
  3922. \def\error{\leavevmode\lower.7ex\copy\errorbox}
  3923. % @tex ... @end tex    escapes into raw Tex temporarily.
  3924. % One exception: @ is still an escape character, so that @end tex works.
  3925. % But \@ or @@ will get a plain tex @ character.
  3926. \envdef\tex{%
  3927.   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
  3928.   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
  3929.   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
  3930.   \catcode `\%=14
  3931.   \catcode `\+=\other
  3932.   \catcode `\"=\other
  3933.   \catcode `\|=\other
  3934.   \catcode `\<=\other
  3935.   \catcode `\>=\other
  3936.   \escapechar=`\\
  3937.   \let\b=\ptexb
  3938.   \let\bullet=\ptexbullet
  3939.   \let\c=\ptexc
  3940.   \let\,=\ptexcomma
  3941.   \let\.=\ptexdot
  3942.   \let\dots=\ptexdots
  3943.   \let\equiv=\ptexequiv
  3944.   \let\!=\ptexexclam
  3945.   \let\i=\ptexi
  3946.   \let\indent=\ptexindent
  3947.   \let\noindent=\ptexnoindent
  3948.   \let\{=\ptexlbrace
  3949.   \let\+=\tabalign
  3950.   \let\}=\ptexrbrace
  3951.   \let\/=\ptexslash
  3952.   \let\*=\ptexstar
  3953.   \let\t=\ptext
  3954.   \let\frenchspacing=\plainfrenchspacing
  3955.   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
  3956.   \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
  3957.   \def\@{@}%
  3958. % There is no need to define \Etex.
  3959. % Define @lisp ... @end lisp.
  3960. % @lisp environment forms a group so it can rebind things,
  3961. % including the definition of @end lisp (which normally is erroneous).
  3962. % Amount to narrow the margins by for @lisp.
  3963. \newskip\lispnarrowing \lispnarrowing=0.4in
  3964. % This is the definition that ^^M gets inside @lisp, @example, and other
  3965. % such environments.  \null is better than a space, since it doesn't
  3966. % have any width.
  3967. \def\lisppar{\null\endgraf}
  3968. % This space is always present above and below environments.
  3969. \newskip\envskipamount \envskipamount = 0pt
  3970. % Make spacing and below environment symmetrical.  We use \parskip here
  3971. % to help in doing that, since in @example-like environments \parskip
  3972. % is reset to zero; thus the \afterenvbreak inserts no space -- but the
  3973. % start of the next paragraph will insert \parskip.
  3974. \def\aboveenvbreak{{%
  3975.   % =10000 instead of <10000 because of a special case in \itemzzz and
  3976.   % \sectionheading, q.v.
  3977.   \ifnum \lastpenalty=10000 \else
  3978.     \advance\envskipamount by \parskip
  3979.     \endgraf
  3980.     \ifdim\lastskip<\envskipamount
  3981.       \removelastskip
  3982.       % it's not a good place to break if the last penalty was \nobreak
  3983.       % or better ...
  3984.       \ifnum\lastpenalty<10000 \penalty-50 \fi
  3985.       \vskip\envskipamount
  3986.     \fi
  3987.   \fi
  3988. \let\afterenvbreak = \aboveenvbreak
  3989. % \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
  3990. % also clear it, so that its embedded environments do the narrowing again.
  3991. \let\nonarrowing=\relax
  3992. % @cartouche ... @end cartouche: draw rectangle w/rounded corners around
  3993. % environment contents.
  3994. \font\circle=lcircle10
  3995. \newdimen\circthick
  3996. \newdimen\cartouter\newdimen\cartinner
  3997. \newskip\normbskip\newskip\normpskip\newskip\normlskip
  3998. \circthick=\fontdimen8\circle
  3999. \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
  4000. \def\ctr{{\hskip 6pt\circle\char'010}}
  4001. \def\cbl{{\circle\char'012\hskip -6pt}}
  4002. \def\cbr{{\hskip 6pt\circle\char'011}}
  4003. \def\carttop{\hbox to \cartouter{\hskip\lskip
  4004.         \ctl\leaders\hrule height\circthick\hfil\ctr
  4005.         \hskip\rskip}}
  4006. \def\cartbot{\hbox to \cartouter{\hskip\lskip
  4007.         \cbl\leaders\hrule height\circthick\hfil\cbr
  4008.         \hskip\rskip}}
  4009. \newskip\lskip\newskip\rskip
  4010. \envdef\cartouche{%
  4011.   \ifhmode\par\fi  % can't be in the midst of a paragraph.
  4012.   \startsavinginserts
  4013.   \lskip=\leftskip \rskip=\rightskip
  4014.   \leftskip=0pt\rightskip=0pt % we want these *outside*.
  4015.   \cartinner=\hsize \advance\cartinner by-\lskip
  4016.   \advance\cartinner by-\rskip
  4017.   \cartouter=\hsize
  4018.   \advance\cartouter by 18.4pt    % allow for 3pt kerns on either
  4019.                 % side, and for 6pt waste from
  4020.                 % each corner char, and rule thickness
  4021.   \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
  4022.   % Flag to tell @lisp, etc., not to narrow margin.
  4023.   \let\nonarrowing = t%
  4024.   \vbox\bgroup
  4025.       \baselineskip=0pt\parskip=0pt\lineskip=0pt
  4026.       \carttop
  4027.       \hbox\bgroup
  4028.       \hskip\lskip
  4029.       \vrule\kern3pt
  4030.       \vbox\bgroup
  4031.           \kern3pt
  4032.           \hsize=\cartinner
  4033.           \baselineskip=\normbskip
  4034.           \lineskip=\normlskip
  4035.           \parskip=\normpskip
  4036.           \vskip -\parskip
  4037.           \comment % For explanation, see the end of \def\group.
  4038. \def\Ecartouche{%
  4039.               \ifhmode\par\fi
  4040.           \kern3pt
  4041.       \egroup
  4042.       \kern3pt\vrule
  4043.       \hskip\rskip
  4044.       \egroup
  4045.       \cartbot
  4046.   \egroup
  4047.   \checkinserts
  4048. % This macro is called at the beginning of all the @example variants,
  4049. % inside a group.
  4050. \def\nonfillstart{%
  4051.   \aboveenvbreak
  4052.   \hfuzz = 12pt % Don't be fussy
  4053.   \sepspaces % Make spaces be word-separators rather than space tokens.
  4054.   \let\par = \lisppar % don't ignore blank lines
  4055.   \obeylines % each line of input is a line of output
  4056.   \parskip = 0pt
  4057.   \parindent = 0pt
  4058.   \emergencystretch = 0pt % don't try to avoid overfull boxes
  4059.   \ifx\nonarrowing\relax
  4060.     \advance \leftskip by \lispnarrowing
  4061.     \exdentamount=\lispnarrowing
  4062.   \else
  4063.     \let\nonarrowing = \relax
  4064.   \fi
  4065.   \let\exdent=\nofillexdent
  4066. % If you want all examples etc. small: @set dispenvsize small.
  4067. % If you want even small examples the full size: @set dispenvsize nosmall.
  4068. % This affects the following displayed environments:
  4069. %    @example, @display, @format, @lisp
  4070. \def\smallword{small}
  4071. \def\nosmallword{nosmall}
  4072. \let\SETdispenvsize\relax
  4073. \def\setnormaldispenv{%
  4074.   \ifx\SETdispenvsize\smallword
  4075.     \smallexamplefonts \rm
  4076.   \fi
  4077. \def\setsmalldispenv{%
  4078.   \ifx\SETdispenvsize\nosmallword
  4079.   \else
  4080.     \smallexamplefonts \rm
  4081.   \fi
  4082. % We often define two environments, @foo and @smallfoo.
  4083. % Let's do it by one command:
  4084. \def\makedispenv #1#2{
  4085.   \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
  4086.   \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
  4087.   \expandafter\let\csname E#1\endcsname \afterenvbreak
  4088.   \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
  4089. % Define two synonyms:
  4090. \def\maketwodispenvs #1#2#3{
  4091.   \makedispenv{#1}{#3}
  4092.   \makedispenv{#2}{#3}
  4093. % @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
  4094. % @smallexample and @smalllisp: use smaller fonts.
  4095. % Originally contributed by Pavel@xerox.
  4096. \maketwodispenvs {lisp}{example}{%
  4097.   \nonfillstart
  4098.   \tt
  4099.   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
  4100.   \gobble       % eat return
  4101. % @display/@smalldisplay: same as @lisp except keep current font.
  4102. \makedispenv {display}{%
  4103.   \nonfillstart
  4104.   \gobble
  4105. % @format/@smallformat: same as @display except don't narrow margins.
  4106. \makedispenv{format}{%
  4107.   \let\nonarrowing = t%
  4108.   \nonfillstart
  4109.   \gobble
  4110. % @flushleft: same as @format, but doesn't obey \SETdispenvsize.
  4111. \envdef\flushleft{%
  4112.   \let\nonarrowing = t%
  4113.   \nonfillstart
  4114.   \gobble
  4115. \let\Eflushleft = \afterenvbreak
  4116. % @flushright.
  4117. \envdef\flushright{%
  4118.   \let\nonarrowing = t%
  4119.   \nonfillstart
  4120.   \advance\leftskip by 0pt plus 1fill
  4121.   \gobble
  4122. \let\Eflushright = \afterenvbreak
  4123. % @quotation does normal linebreaking (hence we can't use \nonfillstart)
  4124. % and narrows the margins.  We keep \parskip nonzero in general, since
  4125. % we're doing normal filling.  So, when using \aboveenvbreak and
  4126. % \afterenvbreak, temporarily make \parskip 0.
  4127. \envdef\quotation{%
  4128.   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
  4129.   \parindent=0pt
  4130.   % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
  4131.   \ifx\nonarrowing\relax
  4132.     \advance\leftskip by \lispnarrowing
  4133.     \advance\rightskip by \lispnarrowing
  4134.     \exdentamount = \lispnarrowing
  4135.   \else
  4136.     \let\nonarrowing = \relax
  4137.   \fi
  4138.   \parsearg\quotationlabel
  4139. % We have retained a nonzero parskip for the environment, since we're
  4140. % doing normal filling.
  4141. \def\Equotation{%
  4142.   \par
  4143.   \ifx\quotationauthor\undefined\else
  4144.     % indent a bit.
  4145.     \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
  4146.   \fi
  4147.   {\parskip=0pt \afterenvbreak}%
  4148. % If we're given an argument, typeset it in bold with a colon after.
  4149. \def\quotationlabel#1{%
  4150.   \def\temp{#1}%
  4151.   \ifx\temp\empty \else
  4152.     {\bf #1: }%
  4153.   \fi
  4154. % LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
  4155. % If we want to allow any <char> as delimiter,
  4156. % we need the curly braces so that makeinfo sees the @verb command, eg:
  4157. % `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
  4158. % [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
  4159. % [Knuth] p.344; only we need to do the other characters Texinfo sets
  4160. % active too.  Otherwise, they get lost as the first character on a
  4161. % verbatim line.
  4162. \def\dospecials{%
  4163.   \do\ \do\\\do\{\do\}\do\$\do\&%
  4164.   \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
  4165.   \do\<\do\>\do\|\do\@\do+\do\"%
  4166. % [Knuth] p. 380
  4167. \def\uncatcodespecials{%
  4168.   \def\do##1{\catcode`##1=\other}\dospecials}
  4169. % [Knuth] pp. 380,381,391
  4170. % Disable Spanish ligatures ?` and !` of \tt font
  4171. \begingroup
  4172.   \catcode`\`=\active\gdef`{\relax\lq}
  4173. \endgroup
  4174. % Setup for the @verb command.
  4175. % Eight spaces for a tab
  4176. \begingroup
  4177.   \catcode`\^^I=\active
  4178.   \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
  4179. \endgroup
  4180. \def\setupverb{%
  4181.   \tt  % easiest (and conventionally used) font for verbatim
  4182.   \def\par{\leavevmode\endgraf}%
  4183.   \catcode`\`=\active
  4184.   \tabeightspaces
  4185.   % Respect line breaks,
  4186.   % print special symbols as themselves, and
  4187.   % make each space count
  4188.   % must do in this order:
  4189.   \obeylines \uncatcodespecials \sepspaces
  4190. % Setup for the @verbatim environment
  4191. % Real tab expansion
  4192. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
  4193. \def\starttabbox{\setbox0=\hbox\bgroup}
  4194. \begingroup
  4195.   \catcode`\^^I=\active
  4196.   \gdef\tabexpand{%
  4197.     \catcode`\^^I=\active
  4198.     \def^^I{\leavevmode\egroup
  4199.       \dimen0=\wd0 % the width so far, or since the previous tab
  4200.       \divide\dimen0 by\tabw
  4201.       \multiply\dimen0 by\tabw % compute previous multiple of \tabw
  4202.       \advance\dimen0 by\tabw  % advance to next multiple of \tabw
  4203.       \wd0=\dimen0 \box0 \starttabbox
  4204.     }%
  4205. \endgroup
  4206. \def\setupverbatim{%
  4207.   \let\nonarrowing = t%
  4208.   \nonfillstart
  4209.   % Easiest (and conventionally used) font for verbatim
  4210.   \tt
  4211.   \def\par{\leavevmode\egroup\box0\endgraf}%
  4212.   \catcode`\`=\active
  4213.   \tabexpand
  4214.   % Respect line breaks,
  4215.   % print special symbols as themselves, and
  4216.   % make each space count
  4217.   % must do in this order:
  4218.   \obeylines \uncatcodespecials \sepspaces
  4219.   \everypar{\starttabbox}%
  4220. % Do the @verb magic: verbatim text is quoted by unique
  4221. % delimiter characters.  Before first delimiter expect a
  4222. % right brace, after last delimiter expect closing brace:
  4223. %    \def\doverb'{'<char>#1<char>'}'{#1}
  4224. % [Knuth] p. 382; only eat outer {}
  4225. \begingroup
  4226.   \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
  4227.   \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
  4228. \endgroup
  4229. \def\verb{\begingroup\setupverb\doverb}
  4230. % Do the @verbatim magic: define the macro \doverbatim so that
  4231. % the (first) argument ends when '@end verbatim' is reached, ie:
  4232. %     \def\doverbatim#1@end verbatim{#1}
  4233. % For Texinfo it's a lot easier than for LaTeX,
  4234. % because texinfo's \verbatim doesn't stop at '\end{verbatim}':
  4235. % we need not redefine '\', '{' and '}'.
  4236. % Inspired by LaTeX's verbatim command set [latex.ltx]
  4237. \begingroup
  4238.   \catcode`\ =\active
  4239.   \obeylines %
  4240.   % ignore everything up to the first ^^M, that's the newline at the end
  4241.   % of the @verbatim input line itself.  Otherwise we get an extra blank
  4242.   % line in the output.
  4243.   \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
  4244.   % We really want {...\end verbatim} in the body of the macro, but
  4245.   % without the active space; thus we have to use \xdef and \gobble.
  4246. \endgroup
  4247. \envdef\verbatim{%
  4248.     \setupverbatim\doverbatim
  4249. \let\Everbatim = \afterenvbreak
  4250. % @verbatiminclude FILE - insert text of file in verbatim environment.
  4251. \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
  4252. \def\doverbatiminclude#1{%
  4253.     \makevalueexpandable
  4254.     \setupverbatim
  4255.     \input #1
  4256.     \afterenvbreak
  4257. % @copying ... @end copying.
  4258. % Save the text away for @insertcopying later.
  4259. % We save the uninterpreted tokens, rather than creating a box.
  4260. % Saving the text in a box would be much easier, but then all the
  4261. % typesetting commands (@smallbook, font changes, etc.) have to be done
  4262. % beforehand -- and a) we want @copying to be done first in the source
  4263. % file; b) letting users define the frontmatter in as flexible order as
  4264. % possible is very desirable.
  4265. \def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
  4266. \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
  4267. \def\insertcopying{%
  4268.   \begingroup
  4269.     \parindent = 0pt  % paragraph indentation looks wrong on title page
  4270.     \scanexp\copyingtext
  4271.   \endgroup
  4272. \message{defuns,}
  4273. % @defun etc.
  4274. \newskip\defbodyindent \defbodyindent=.4in
  4275. \newskip\defargsindent \defargsindent=50pt
  4276. \newskip\deflastargmargin \deflastargmargin=18pt
  4277. % Start the processing of @deffn:
  4278. \def\startdefun{%
  4279.   \ifnum\lastpenalty<10000
  4280.     \medbreak
  4281.   \else
  4282.     % If there are two @def commands in a row, we'll have a \nobreak,
  4283.     % which is there to keep the function description together with its
  4284.     % header.  But if there's nothing but headers, we need to allow a
  4285.     % break somewhere.  Check specifically for penalty 10002, inserted
  4286.     % by \defargscommonending, instead of 10000, since the sectioning
  4287.     % commands also insert a nobreak penalty, and we don't want to allow
  4288.     % a break between a section heading and a defun.
  4289.     % 
  4290.     \ifnum\lastpenalty=10002 \penalty2000 \fi
  4291.     %
  4292.     % Similarly, after a section heading, do not allow a break.
  4293.     % But do insert the glue.
  4294.     \medskip  % preceded by discardable penalty, so not a breakpoint
  4295.   \fi
  4296.   \parindent=0in
  4297.   \advance\leftskip by \defbodyindent
  4298.   \exdentamount=\defbodyindent
  4299. \def\dodefunx#1{%
  4300.   % First, check whether we are in the right environment:
  4301.   \checkenv#1%
  4302.   % As above, allow line break if we have multiple x headers in a row.
  4303.   % It's not a great place, though.
  4304.   \ifnum\lastpenalty=10002 \penalty3000 \fi
  4305.   % And now, it's time to reuse the body of the original defun:
  4306.   \expandafter\gobbledefun#1%
  4307. \def\gobbledefun#1\startdefun{}
  4308. % \printdefunline \deffnheader{text}
  4309. \def\printdefunline#1#2{%
  4310.   \begingroup
  4311.     % call \deffnheader:
  4312.     #1#2 \endheader
  4313.     % common ending:
  4314.     \interlinepenalty = 10000
  4315.     \advance\rightskip by 0pt plus 1fil
  4316.     \endgraf
  4317.     \nobreak\vskip -\parskip
  4318.     \penalty 10002  % signal to \startdefun and \dodefunx
  4319.     % Some of the @defun-type tags do not enable magic parentheses,
  4320.     % rendering the following check redundant.  But we don't optimize.
  4321.     \checkparencounts
  4322.   \endgroup
  4323. \def\Edefun{\endgraf\medbreak}
  4324. % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
  4325. % the only thing remainnig is to define \deffnheader.
  4326. \def\makedefun#1{%
  4327.   \expandafter\let\csname E#1\endcsname = \Edefun
  4328.   \edef\temp{\noexpand\domakedefun
  4329.     \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
  4330.   \temp
  4331. % \domakedefun \deffn \deffnx \deffnheader
  4332. % Define \deffn and \deffnx, without parameters.
  4333. % \deffnheader has to be defined explicitly.
  4334. \def\domakedefun#1#2#3{%
  4335.   \envdef#1{%
  4336.     \startdefun
  4337.     \parseargusing\activeparens{\printdefunline#3}%
  4338.   \def#2{\dodefunx#1}%
  4339.   \def#3%
  4340. %%% Untyped functions:
  4341. % @deffn category name args
  4342. \makedefun{deffn}{\deffngeneral{}}
  4343. % @deffn category class name args
  4344. \makedefun{defop}#1 {\defopon{#1\ \putwordon}}
  4345. % \defopon {category on}class name args
  4346. \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
  4347. % \deffngeneral {subind}category name args
  4348. \def\deffngeneral#1#2 #3 #4\endheader{%
  4349.   % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
  4350.   \dosubind{fn}{\code{#3}}{#1}%
  4351.   \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
  4352. %%% Typed functions:
  4353. % @deftypefn category type name args
  4354. \makedefun{deftypefn}{\deftypefngeneral{}}
  4355. % @deftypeop category class type name args
  4356. \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
  4357. % \deftypeopon {category on}class type name args
  4358. \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
  4359. % \deftypefngeneral {subind}category type name args
  4360. \def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
  4361.   \dosubind{fn}{\code{#4}}{#1}%
  4362.   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
  4363. %%% Typed variables:
  4364. % @deftypevr category type var args
  4365. \makedefun{deftypevr}{\deftypecvgeneral{}}
  4366. % @deftypecv category class type var args
  4367. \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
  4368. % \deftypecvof {category of}class type var args
  4369. \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
  4370. % \deftypecvgeneral {subind}category type var args
  4371. \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
  4372.   \dosubind{vr}{\code{#4}}{#1}%
  4373.   \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
  4374. %%% Untyped variables:
  4375. % @defvr category var args
  4376. \makedefun{defvr}#1 {\deftypevrheader{#1} {} }
  4377. % @defcv category class var args
  4378. \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
  4379. % \defcvof {category of}class var args
  4380. \def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
  4381. %%% Type:
  4382. % @deftp category name args
  4383. \makedefun{deftp}#1 #2 #3\endheader{%
  4384.   \doind{tp}{\code{#2}}%
  4385.   \defname{#1}{}{#2}\defunargs{#3\unskip}%
  4386. % Remaining @defun-like shortcuts:
  4387. \makedefun{defun}{\deffnheader{\putwordDeffunc} }
  4388. \makedefun{defmac}{\deffnheader{\putwordDefmac} }
  4389. \makedefun{defspec}{\deffnheader{\putwordDefspec} }
  4390. \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
  4391. \makedefun{defvar}{\defvrheader{\putwordDefvar} }
  4392. \makedefun{defopt}{\defvrheader{\putwordDefopt} }
  4393. \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
  4394. \makedefun{defmethod}{\defopon\putwordMethodon}
  4395. \makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
  4396. \makedefun{defivar}{\defcvof\putwordInstanceVariableof}
  4397. \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
  4398. % \defname, which formats the name of the @def (not the args).
  4399. % #1 is the category, such as "Function".
  4400. % #2 is the return type, if any.
  4401. % #3 is the function name.
  4402. % We are followed by (but not passed) the arguments, if any.
  4403. \def\defname#1#2#3{%
  4404.   % Get the values of \leftskip and \rightskip as they were outside the @def...
  4405.   \advance\leftskip by -\defbodyindent
  4406.   % How we'll format the type name.  Putting it in brackets helps
  4407.   % distinguish it from the body text that may end up on the next line
  4408.   % just below it.
  4409.   \def\temp{#1}%
  4410.   \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
  4411.   % Figure out line sizes for the paragraph shape.
  4412.   % The first line needs space for \box0; but if \rightskip is nonzero,
  4413.   % we need only space for the part of \box0 which exceeds it:
  4414.   \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
  4415.   % The continuations:
  4416.   \dimen2=\hsize  \advance\dimen2 by -\defargsindent
  4417.   % (plain.tex says that \dimen1 should be used only as global.)
  4418.   \parshape 2 0in \dimen0 \defargsindent \dimen2
  4419.   % Put the type name to the right margin.
  4420.   \noindent
  4421.   \hbox to 0pt{%
  4422.     \hfil\box0 \kern-\hsize
  4423.     % \hsize has to be shortened this way:
  4424.     \kern\leftskip
  4425.     % Intentionally do not respect \rightskip, since we need the space.
  4426.   % Allow all lines to be underfull without complaint:
  4427.   \tolerance=10000 \hbadness=10000
  4428.   \exdentamount=\defbodyindent
  4429.     % defun fonts. We use typewriter by default (used to be bold) because:
  4430.     % . we're printing identifiers, they should be in tt in principle.
  4431.     % . in languages with many accents, such as Czech or French, it's
  4432.     %   common to leave accents off identifiers.  The result looks ok in
  4433.     %   tt, but exceedingly strange in rm.
  4434.     % . we don't want -- and --- to be treated as ligatures.
  4435.     % . this still does not fix the ?` and !` ligatures, but so far no
  4436.     %   one has made identifiers using them :).
  4437.     \df \tt
  4438.     \def\temp{#2}% return value type
  4439.     \ifx\temp\empty\else \tclose{\temp} \fi
  4440.     #3% output function name
  4441.   {\rm\enskip}% hskip 0.5 em of \tenrm
  4442.   \boldbrax
  4443.   % arguments will be output next, if any.
  4444. % Print arguments in slanted roman (not ttsl), inconsistently with using
  4445. % tt for the name.  This is because literal text is sometimes needed in
  4446. % the argument list (groff manual), and ttsl and tt are not very
  4447. % distinguishable.  Prevent hyphenation at `-' chars.
  4448. \def\defunargs#1{%
  4449.   % use sl by default (not ttsl),
  4450.   % tt for the names.
  4451.   \df \sl \hyphenchar\font=0
  4452.   % On the other hand, if an argument has two dashes (for instance), we
  4453.   % want a way to get ttsl.  Let's try @var for that.
  4454.   \let\var=\ttslanted
  4455.   #1%
  4456.   \sl\hyphenchar\font=45
  4457. % We want ()&[] to print specially on the defun line.
  4458. \def\activeparens{%
  4459.   \catcode`\(=\active \catcode`\)=\active
  4460.   \catcode`\[=\active \catcode`\]=\active
  4461.   \catcode`\&=\active
  4462. % Make control sequences which act like normal parenthesis chars.
  4463. \let\lparen = ( \let\rparen = )
  4464. % Be sure that we always have a definition for `(', etc.  For example,
  4465. % if the fn name has parens in it, \boldbrax will not be in effect yet,
  4466. % so TeX would otherwise complain about undefined control sequence.
  4467.   \activeparens
  4468.   \global\let(=\lparen \global\let)=\rparen
  4469.   \global\let[=\lbrack \global\let]=\rbrack
  4470.   \global\let& = \&
  4471.   \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
  4472.   \gdef\magicamp{\let&=\amprm}
  4473. \newcount\parencount
  4474. % If we encounter &foo, then turn on ()-hacking afterwards
  4475. \newif\ifampseen
  4476. \def\amprm#1 {\ampseentrue{\bf\ }}
  4477. \def\parenfont{%
  4478.   \ifampseen
  4479.     % At the first level, print parens in roman,
  4480.     % otherwise use the default font.
  4481.     \ifnum \parencount=1 \rm \fi
  4482.   \else
  4483.     % The \sf parens (in \boldbrax) actually are a little bolder than
  4484.     % the contained text.  This is especially needed for [ and ] .
  4485.     \sf
  4486.   \fi
  4487. \def\infirstlevel#1{%
  4488.   \ifampseen
  4489.     \ifnum\parencount=1
  4490.       #1%
  4491.     \fi
  4492.   \fi
  4493. \def\bfafterword#1 {#1 \bf}
  4494. \def\opnr{%
  4495.   \global\advance\parencount by 1
  4496.   {\parenfont(}%
  4497.   \infirstlevel \bfafterword
  4498. \def\clnr{%
  4499.   {\parenfont)}%
  4500.   \infirstlevel \sl
  4501.   \global\advance\parencount by -1
  4502. \newcount\brackcount
  4503. \def\lbrb{%
  4504.   \global\advance\brackcount by 1
  4505.   {\bf[}%
  4506. \def\rbrb{%
  4507.   {\bf]}%
  4508.   \global\advance\brackcount by -1
  4509. \def\checkparencounts{%
  4510.   \ifnum\parencount=0 \else \badparencount \fi
  4511.   \ifnum\brackcount=0 \else \badbrackcount \fi
  4512. \def\badparencount{%
  4513.   \errmessage{Unbalanced parentheses in @def}%
  4514.   \global\parencount=0
  4515. \def\badbrackcount{%
  4516.   \errmessage{Unbalanced square braces in @def}%
  4517.   \global\brackcount=0
  4518. \message{macros,}
  4519. % @macro.
  4520. % To do this right we need a feature of e-TeX, \scantokens,
  4521. % which we arrange to emulate with a temporary file in ordinary TeX.
  4522. \ifx\eTeXversion\undefined
  4523.   \newwrite\macscribble
  4524.   \def\scantokens#1{%
  4525.     \toks0={#1}%
  4526.     \immediate\openout\macscribble=\jobname.tmp
  4527.     \immediate\write\macscribble{\the\toks0}%
  4528.     \immediate\closeout\macscribble
  4529.     \input \jobname.tmp
  4530. \def\scanmacro#1{%
  4531.   \begingroup
  4532.     \newlinechar`\^^M
  4533.     \let\xeatspaces\eatspaces
  4534.     % Undo catcode changes of \startcontents and \doprintindex
  4535.     % When called from @insertcopying or (short)caption, we need active
  4536.     % backslash to get it printed correctly.  Previously, we had
  4537.     % \catcode`\\=\other instead.  We'll see whether a problem appears
  4538.     % with macro expansion.                --kasal, 19aug04
  4539.     \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
  4540.     % ... and \example
  4541.     \spaceisspace
  4542.     %
  4543.     % Append \endinput to make sure that TeX does not see the ending newline.
  4544.     %
  4545.     % I've verified that it is necessary both for e-TeX and for ordinary TeX
  4546.     %                            --kasal, 29nov03
  4547.     \scantokens{#1\endinput}%
  4548.   \endgroup
  4549. \def\scanexp#1{%
  4550.   \edef\temp{\noexpand\scanmacro{#1}}%
  4551.   \temp
  4552. \newcount\paramno   % Count of parameters
  4553. \newtoks\macname    % Macro name
  4554. \newif\ifrecursive  % Is it recursive?
  4555. % List of all defined macros in the form
  4556. %    \definedummyword\macro1\definedummyword\macro2...
  4557. % Currently is also contains all @aliases; the list can be split
  4558. % if there is a need.
  4559. \def\macrolist{}
  4560. % Add the macro to \macrolist
  4561. \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
  4562. \def\addtomacrolistxxx#1{%
  4563.      \toks0 = \expandafter{\macrolist\definedummyword#1}%
  4564.      \xdef\macrolist{\the\toks0}%
  4565. % Utility routines.
  4566. % This does \let #1 = #2, with \csnames; that is,
  4567. %   \let \csname#1\endcsname = \csname#2\endcsname
  4568. % (except of course we have to play expansion games).
  4569. \def\cslet#1#2{%
  4570.   \expandafter\let
  4571.   \csname#1\expandafter\endcsname
  4572.   \csname#2\endcsname
  4573. % Trim leading and trailing spaces off a string.
  4574. % Concepts from aro-bend problem 15 (see CTAN).
  4575. {\catcode`\@=11
  4576. \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
  4577. \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
  4578. \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
  4579. \def\unbrace#1{#1}
  4580. \unbrace{\gdef\trim@@@ #1 } #2@{#1}
  4581. % Trim a single trailing ^^M off a string.
  4582. {\catcode`\^^M=\other \catcode`\Q=3%
  4583. \gdef\eatcr #1{\eatcra #1Q^^MQ}%
  4584. \gdef\eatcra#1^^MQ{\eatcrb#1Q}%
  4585. \gdef\eatcrb#1Q#2Q{#1}%
  4586. % Macro bodies are absorbed as an argument in a context where
  4587. % all characters are catcode 10, 11 or 12, except \ which is active
  4588. % (as in normal texinfo). It is necessary to change the definition of \.
  4589. % It's necessary to have hard CRs when the macro is executed. This is
  4590. % done by  making ^^M (\endlinechar) catcode 12 when reading the macro
  4591. % body, and then making it the \newlinechar in \scanmacro.
  4592. \def\scanctxt{%
  4593.   \catcode`\"=\other
  4594.   \catcode`\+=\other
  4595.   \catcode`\<=\other
  4596.   \catcode`\>=\other
  4597.   \catcode`\@=\other
  4598.   \catcode`\^=\other
  4599.   \catcode`\_=\other
  4600.   \catcode`\|=\other
  4601.   \catcode`\~=\other
  4602. \def\scanargctxt{%
  4603.   \scanctxt
  4604.   \catcode`\\=\other
  4605.   \catcode`\^^M=\other
  4606. \def\macrobodyctxt{%
  4607.   \scanctxt
  4608.   \catcode`\{=\other
  4609.   \catcode`\}=\other
  4610.   \catcode`\^^M=\other
  4611.   \usembodybackslash
  4612. \def\macroargctxt{%
  4613.   \scanctxt
  4614.   \catcode`\\=\other
  4615. % \mbodybackslash is the definition of \ in @macro bodies.
  4616. % It maps \foo\ => \csname macarg.foo\endcsname => #N
  4617. % where N is the macro parameter number.
  4618. % We define \csname macarg.\endcsname to be \realbackslash, so
  4619. % \\ in macro replacement text gets you a backslash.
  4620. {\catcode`@=0 @catcode`@\=@active
  4621.  @gdef@usembodybackslash{@let\=@mbodybackslash}
  4622.  @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
  4623. \expandafter\def\csname macarg.\endcsname{\realbackslash}
  4624. \def\macro{\recursivefalse\parsearg\macroxxx}
  4625. \def\rmacro{\recursivetrue\parsearg\macroxxx}
  4626. \def\macroxxx#1{%
  4627.   \getargs{#1}%           now \macname is the macname and \argl the arglist
  4628.   \ifx\argl\empty       % no arguments
  4629.      \paramno=0%
  4630.   \else
  4631.      \expandafter\parsemargdef \argl;%
  4632.   \fi
  4633.   \if1\csname ismacro.\the\macname\endcsname
  4634.      \message{Warning: redefining \the\macname}%
  4635.   \else
  4636.      \expandafter\ifx\csname \the\macname\endcsname \relax
  4637.      \else \errmessage{Macro name \the\macname\space already defined}\fi
  4638.      \global\cslet{macsave.\the\macname}{\the\macname}%
  4639.      \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
  4640.      \addtomacrolist{\the\macname}%
  4641.   \fi
  4642.   \begingroup \macrobodyctxt
  4643.   \ifrecursive \expandafter\parsermacbody
  4644.   \else \expandafter\parsemacbody
  4645.   \fi}
  4646. \parseargdef\unmacro{%
  4647.   \if1\csname ismacro.#1\endcsname
  4648.     \global\cslet{#1}{macsave.#1}%
  4649.     \global\expandafter\let \csname ismacro.#1\endcsname=0%
  4650.     % Remove the macro name from \macrolist:
  4651.     \begingroup
  4652.       \expandafter\let\csname#1\endcsname \relax
  4653.       \let\definedummyword\unmacrodo
  4654.       \xdef\macrolist{\macrolist}%
  4655.     \endgroup
  4656.   \else
  4657.     \errmessage{Macro #1 not defined}%
  4658.   \fi
  4659. % Called by \do from \dounmacro on each macro.  The idea is to omit any
  4660. % macro definitions that have been changed to \relax.
  4661. \def\unmacrodo#1{%
  4662.   \ifx #1\relax
  4663.     % remove this
  4664.   \else
  4665.     \noexpand\definedummyword \noexpand#1%
  4666.   \fi
  4667. % This makes use of the obscure feature that if the last token of a
  4668. % <parameter list> is #, then the preceding argument is delimited by
  4669. % an opening brace, and that opening brace is not consumed.
  4670. \def\getargs#1{\getargsxxx#1{}}
  4671. \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
  4672. \def\getmacname #1 #2\relax{\macname={#1}}
  4673. \def\getmacargs#1{\def\argl{#1}}
  4674. % Parse the optional {params} list.  Set up \paramno and \paramlist
  4675. % so \defmacro knows what to do.  Define \macarg.blah for each blah
  4676. % in the params list, to be ##N where N is the position in that list.
  4677. % That gets used by \mbodybackslash (above).
  4678. % We need to get `macro parameter char #' into several definitions.
  4679. % The technique used is stolen from LaTeX:  let \hash be something
  4680. % unexpandable, insert that wherever you need a #, and then redefine
  4681. % it to # just before using the token list produced.
  4682. % The same technique is used to protect \eatspaces till just before
  4683. % the macro is used.
  4684. \def\parsemargdef#1;{\paramno=0\def\paramlist{}%
  4685.         \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
  4686. \def\parsemargdefxxx#1,{%
  4687.   \if#1;\let\next=\relax
  4688.   \else \let\next=\parsemargdefxxx
  4689.     \advance\paramno by 1%
  4690.     \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
  4691.         {\xeatspaces{\hash\the\paramno}}%
  4692.     \edef\paramlist{\paramlist\hash\the\paramno,}%
  4693.   \fi\next}
  4694. % These two commands read recursive and nonrecursive macro bodies.
  4695. % (They're different since rec and nonrec macros end differently.)
  4696. \long\def\parsemacbody#1@end macro%
  4697. {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
  4698. \long\def\parsermacbody#1@end rmacro%
  4699. {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
  4700. % This defines the macro itself. There are six cases: recursive and
  4701. % nonrecursive macros of zero, one, and many arguments.
  4702. % Much magic with \expandafter here.
  4703. % \xdef is used so that macro definitions will survive the file
  4704. % they're defined in; @include reads the file inside a group.
  4705. \def\defmacro{%
  4706.   \let\hash=##% convert placeholders to macro parameter chars
  4707.   \ifrecursive
  4708.     \ifcase\paramno
  4709.     % 0
  4710.       \expandafter\xdef\csname\the\macname\endcsname{%
  4711.         \noexpand\scanmacro{\temp}}%
  4712.     \or % 1
  4713.       \expandafter\xdef\csname\the\macname\endcsname{%
  4714.          \bgroup\noexpand\macroargctxt
  4715.          \noexpand\braceorline
  4716.          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
  4717.       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
  4718.          \egroup\noexpand\scanmacro{\temp}}%
  4719.     \else % many
  4720.       \expandafter\xdef\csname\the\macname\endcsname{%
  4721.          \bgroup\noexpand\macroargctxt
  4722.          \noexpand\csname\the\macname xx\endcsname}%
  4723.       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
  4724.           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
  4725.       \expandafter\expandafter
  4726.       \expandafter\xdef
  4727.       \expandafter\expandafter
  4728.         \csname\the\macname xxx\endcsname
  4729.           \paramlist{\egroup\noexpand\scanmacro{\temp}}%
  4730.     \fi
  4731.   \else
  4732.     \ifcase\paramno
  4733.     % 0
  4734.       \expandafter\xdef\csname\the\macname\endcsname{%
  4735.         \noexpand\norecurse{\the\macname}%
  4736.         \noexpand\scanmacro{\temp}\egroup}%
  4737.     \or % 1
  4738.       \expandafter\xdef\csname\the\macname\endcsname{%
  4739.          \bgroup\noexpand\macroargctxt
  4740.          \noexpand\braceorline
  4741.          \expandafter\noexpand\csname\the\macname xxx\endcsname}%
  4742.       \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
  4743.         \egroup
  4744.         \noexpand\norecurse{\the\macname}%
  4745.         \noexpand\scanmacro{\temp}\egroup}%
  4746.     \else % many
  4747.       \expandafter\xdef\csname\the\macname\endcsname{%
  4748.          \bgroup\noexpand\macroargctxt
  4749.          \expandafter\noexpand\csname\the\macname xx\endcsname}%
  4750.       \expandafter\xdef\csname\the\macname xx\endcsname##1{%
  4751.           \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
  4752.       \expandafter\expandafter
  4753.       \expandafter\xdef
  4754.       \expandafter\expandafter
  4755.       \csname\the\macname xxx\endcsname
  4756.       \paramlist{%
  4757.           \egroup
  4758.           \noexpand\norecurse{\the\macname}%
  4759.           \noexpand\scanmacro{\temp}\egroup}%
  4760.     \fi
  4761.   \fi}
  4762. \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
  4763. % \braceorline decides whether the next nonwhitespace character is a
  4764. % {.  If so it reads up to the closing }, if not, it reads the whole
  4765. % line.  Whatever was read is then fed to the next control sequence
  4766. % as an argument (by \parsebrace or \parsearg)
  4767. \def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
  4768. \def\braceorlinexxx{%
  4769.   \ifx\nchar\bgroup\else
  4770.     \expandafter\parsearg
  4771.   \fi \next}
  4772. % @alias.
  4773. % We need some trickery to remove the optional spaces around the equal
  4774. % sign.  Just make them active and then expand them all to nothing.
  4775. \def\alias{\parseargusing\obeyspaces\aliasxxx}
  4776. \def\aliasxxx #1{\aliasyyy#1\relax}
  4777. \def\aliasyyy #1=#2\relax{%
  4778.     \expandafter\let\obeyedspace=\empty
  4779.     \addtomacrolist{#1}%
  4780.     \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
  4781.   \next
  4782. \message{cross references,}
  4783. \newwrite\auxfile
  4784. \newif\ifhavexrefs    % True if xref values are known.
  4785. \newif\ifwarnedxrefs  % True if we warned once that they aren't known.
  4786. % @inforef is relatively simple.
  4787. \def\inforef #1{\inforefzzz #1,,,,**}
  4788. \def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
  4789.   node \samp{\ignorespaces#1{}}}
  4790. % @node's only job in TeX is to define \lastnode, which is used in
  4791. % cross-references.  The @node line might or might not have commas, and
  4792. % might or might not have spaces before the first comma, like:
  4793. % @node foo , bar , ...
  4794. % We don't want such trailing spaces in the node name.
  4795. \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
  4796. % also remove a trailing comma, in case of something like this:
  4797. % @node Help-Cross,  ,  , Cross-refs
  4798. \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
  4799. \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
  4800. \let\nwnode=\node
  4801. \let\lastnode=\empty
  4802. % Write a cross-reference definition for the current node.  #1 is the
  4803. % type (Ynumbered, Yappendix, Ynothing).
  4804. \def\donoderef#1{%
  4805.   \ifx\lastnode\empty\else
  4806.     \setref{\lastnode}{#1}%
  4807.     \global\let\lastnode=\empty
  4808.   \fi
  4809. % @anchor{NAME} -- define xref target at arbitrary point.
  4810. \newcount\savesfregister
  4811. \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
  4812. \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
  4813. \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
  4814. % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
  4815. % anchor), which consists of three parts:
  4816. % 1) NAME-title - the current sectioning name taken from \thissection,
  4817. %                 or the anchor name.
  4818. % 2) NAME-snt   - section number and type, passed as the SNT arg, or
  4819. %                 empty for anchors.
  4820. % 3) NAME-pg    - the page number.
  4821. % This is called from \donoderef, \anchor, and \dofloat.  In the case of
  4822. % floats, there is an additional part, which is not written here:
  4823. % 4) NAME-lof   - the text as it should appear in a @listoffloats.
  4824. \def\setref#1#2{%
  4825.   \pdfmkdest{#1}%
  4826.   \iflinks
  4827.     {%
  4828.       \atdummies  % preserve commands, but don't expand them
  4829.       \edef\writexrdef##1##2{%
  4830.     \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
  4831.       ##1}{##2}}% these are parameters of \writexrdef
  4832.       }%
  4833.       \toks0 = \expandafter{\thissection}%
  4834.       \immediate \writexrdef{title}{\the\toks0 }%
  4835.       \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
  4836.       \writexrdef{pg}{\folio}% will be written later, during \shipout
  4837.     }%
  4838.   \fi
  4839. % @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
  4840. % the node name, #2 the name of the Info cross-reference, #3 the printed
  4841. % node name, #4 the name of the Info file, #5 the name of the printed
  4842. % manual.  All but the node name can be omitted.
  4843. \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
  4844. \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
  4845. \def\ref#1{\xrefX[#1,,,,,,,]}
  4846. \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
  4847.   \unsepspaces
  4848.   \def\printedmanual{\ignorespaces #5}%
  4849.   \def\printedrefname{\ignorespaces #3}%
  4850.   \setbox1=\hbox{\printedmanual\unskip}%
  4851.   \setbox0=\hbox{\printedrefname\unskip}%
  4852.   \ifdim \wd0 = 0pt
  4853.     % No printed node name was explicitly given.
  4854.     \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
  4855.       % Use the node name inside the square brackets.
  4856.       \def\printedrefname{\ignorespaces #1}%
  4857.     \else
  4858.       % Use the actual chapter/section title appear inside
  4859.       % the square brackets.  Use the real section title if we have it.
  4860.       \ifdim \wd1 > 0pt
  4861.         % It is in another manual, so we don't have it.
  4862.         \def\printedrefname{\ignorespaces #1}%
  4863.       \else
  4864.         \ifhavexrefs
  4865.           % We know the real title if we have the xref values.
  4866.           \def\printedrefname{\refx{#1-title}{}}%
  4867.         \else
  4868.           % Otherwise just copy the Info node name.
  4869.           \def\printedrefname{\ignorespaces #1}%
  4870.         \fi%
  4871.       \fi
  4872.     \fi
  4873.   \fi
  4874.   % Make link in pdf output.
  4875.   \ifpdf
  4876.     \leavevmode
  4877.     \getfilename{#4}%
  4878.     {\turnoffactive
  4879.      % See comments at \activebackslashdouble.
  4880.      {\activebackslashdouble \xdef\pdfxrefdest{#1}%
  4881.       \backslashparens\pdfxrefdest}%
  4882.      %
  4883.      \ifnum\filenamelength>0
  4884.        \startlink attr{/Border [0 0 0]}%
  4885.          goto file{\the\filename.pdf} name{\pdfxrefdest}%
  4886.      \else
  4887.        \startlink attr{/Border [0 0 0]}%
  4888.          goto name{\pdfmkpgn{\pdfxrefdest}}%
  4889.      \fi
  4890.     }%
  4891.     \linkcolor
  4892.   \fi
  4893.   % Float references are printed completely differently: "Figure 1.2"
  4894.   % instead of "[somenode], p.3".  We distinguish them by the
  4895.   % LABEL-title being set to a magic string.
  4896.     % Have to otherify everything special to allow the \csname to
  4897.     % include an _ in the xref name, etc.
  4898.     \indexnofonts
  4899.     \turnoffactive
  4900.     \expandafter\global\expandafter\let\expandafter\Xthisreftitle
  4901.       \csname XR#1-title\endcsname
  4902.   \iffloat\Xthisreftitle
  4903.     % If the user specified the print name (third arg) to the ref,
  4904.     % print it instead of our usual "Figure 1.2".
  4905.     \ifdim\wd0 = 0pt
  4906.       \refx{#1-snt}%
  4907.     \else
  4908.       \printedrefname
  4909.     \fi
  4910.     %
  4911.     % if the user also gave the printed manual name (fifth arg), append
  4912.     % "in MANUALNAME".
  4913.     \ifdim \wd1 > 0pt
  4914.       \space \putwordin{} \cite{\printedmanual}%
  4915.     \fi
  4916.   \else
  4917.     % node/anchor (non-float) references.
  4918.     %
  4919.     % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
  4920.     % insert empty discretionaries after hyphens, which means that it will
  4921.     % not find a line break at a hyphen in a node names.  Since some manuals
  4922.     % are best written with fairly long node names, containing hyphens, this
  4923.     % is a loss.  Therefore, we give the text of the node name again, so it
  4924.     % is as if TeX is seeing it for the first time.
  4925.     \ifdim \wd1 > 0pt
  4926.       \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
  4927.     \else
  4928.       % _ (for example) has to be the character _ for the purposes of the
  4929.       % control sequence corresponding to the node, but it has to expand
  4930.       % into the usual \leavevmode...\vrule stuff for purposes of
  4931.       % printing. So we \turnoffactive for the \refx-snt, back on for the
  4932.       % printing, back off for the \refx-pg.
  4933.       {\turnoffactive
  4934.        % Only output a following space if the -snt ref is nonempty; for
  4935.        % @unnumbered and @anchor, it won't be.
  4936.        \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
  4937.        \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
  4938.       }%
  4939.       % output the `[mynode]' via a macro so it can be overridden.
  4940.       \xrefprintnodename\printedrefname
  4941.       %
  4942.       % But we always want a comma and a space:
  4943.       ,\space
  4944.       %
  4945.       % output the `page 3'.
  4946.       \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
  4947.     \fi
  4948.   \fi
  4949.   \endlink
  4950. \endgroup}
  4951. % This macro is called from \xrefX for the `[nodename]' part of xref
  4952. % output.  It's a separate macro only so it can be changed more easily,
  4953. % since square brackets don't work well in some documents.  Particularly
  4954. % one that Bob is working on :).
  4955. \def\xrefprintnodename#1{[#1]}
  4956. % Things referred to by \setref.
  4957. \def\Ynothing{}
  4958. \def\Yomitfromtoc{}
  4959. \def\Ynumbered{%
  4960.   \ifnum\secno=0
  4961.     \putwordChapter@tie \the\chapno
  4962.   \else \ifnum\subsecno=0
  4963.     \putwordSection@tie \the\chapno.\the\secno
  4964.   \else \ifnum\subsubsecno=0
  4965.     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
  4966.   \else
  4967.     \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
  4968.   \fi\fi\fi
  4969. \def\Yappendix{%
  4970.   \ifnum\secno=0
  4971.      \putwordAppendix@tie @char\the\appendixno{}%
  4972.   \else \ifnum\subsecno=0
  4973.      \putwordSection@tie @char\the\appendixno.\the\secno
  4974.   \else \ifnum\subsubsecno=0
  4975.     \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
  4976.   \else
  4977.     \putwordSection@tie
  4978.       @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
  4979.   \fi\fi\fi
  4980. % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
  4981. % If its value is nonempty, SUFFIX is output afterward.
  4982. \def\refx#1#2{%
  4983.     \indexnofonts
  4984.     \otherbackslash
  4985.     \expandafter\global\expandafter\let\expandafter\thisrefX
  4986.       \csname XR#1\endcsname
  4987.   \ifx\thisrefX\relax
  4988.     % If not defined, say something at least.
  4989.     \angleleft un\-de\-fined\angleright
  4990.     \iflinks
  4991.       \ifhavexrefs
  4992.         \message{\linenumber Undefined cross reference `#1'.}%
  4993.       \else
  4994.         \ifwarnedxrefs\else
  4995.           \global\warnedxrefstrue
  4996.           \message{Cross reference values unknown; you must run TeX again.}%
  4997.         \fi
  4998.       \fi
  4999.     \fi
  5000.   \else
  5001.     % It's defined, so just use it.
  5002.     \thisrefX
  5003.   \fi
  5004.   #2% Output the suffix in any case.
  5005. % This is the macro invoked by entries in the aux file.  Usually it's
  5006. % just a \def (we prepend XR to the control sequence name to avoid
  5007. % collisions).  But if this is a float type, we have more work to do.
  5008. \def\xrdef#1#2{%
  5009.   \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value.
  5010.   % Was that xref control sequence that we just defined for a float?
  5011.   \expandafter\iffloat\csname XR#1\endcsname
  5012.     % it was a float, and we have the (safe) float type in \iffloattype.
  5013.     \expandafter\let\expandafter\floatlist
  5014.       \csname floatlist\iffloattype\endcsname
  5015.     %
  5016.     % Is this the first time we've seen this float type?
  5017.     \expandafter\ifx\floatlist\relax
  5018.       \toks0 = {\do}% yes, so just \do
  5019.     \else
  5020.       % had it before, so preserve previous elements in list.
  5021.       \toks0 = \expandafter{\floatlist\do}%
  5022.     \fi
  5023.     %
  5024.     % Remember this xref in the control sequence \floatlistFLOATTYPE,
  5025.     % for later use in \listoffloats.
  5026.     \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}%
  5027.   \fi
  5028. % Read the last existing aux file, if any.  No error if none exists.
  5029. \def\tryauxfile{%
  5030.   \openin 1 \jobname.aux
  5031.   \ifeof 1 \else
  5032.     \readdatafile{aux}%
  5033.     \global\havexrefstrue
  5034.   \fi
  5035.   \closein 1
  5036. \def\setupdatafile{%
  5037.   \catcode`\^^@=\other
  5038.   \catcode`\^^A=\other
  5039.   \catcode`\^^B=\other
  5040.   \catcode`\^^C=\other
  5041.   \catcode`\^^D=\other
  5042.   \catcode`\^^E=\other
  5043.   \catcode`\^^F=\other
  5044.   \catcode`\^^G=\other
  5045.   \catcode`\^^H=\other
  5046.   \catcode`\^^K=\other
  5047.   \catcode`\^^L=\other
  5048.   \catcode`\^^N=\other
  5049.   \catcode`\^^P=\other
  5050.   \catcode`\^^Q=\other
  5051.   \catcode`\^^R=\other
  5052.   \catcode`\^^S=\other
  5053.   \catcode`\^^T=\other
  5054.   \catcode`\^^U=\other
  5055.   \catcode`\^^V=\other
  5056.   \catcode`\^^W=\other
  5057.   \catcode`\^^X=\other
  5058.   \catcode`\^^Z=\other
  5059.   \catcode`\^^[=\other
  5060.   \catcode`\^^\=\other
  5061.   \catcode`\^^]=\other
  5062.   \catcode`\^^^=\other
  5063.   \catcode`\^^_=\other
  5064.   % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
  5065.   % in xref tags, i.e., node names.  But since ^^e4 notation isn't
  5066.   % supported in the main text, it doesn't seem desirable.  Furthermore,
  5067.   % that is not enough: for node names that actually contain a ^
  5068.   % character, we would end up writing a line like this: 'xrdef {'hat
  5069.   % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
  5070.   % argument, and \hat is not an expandable control sequence.  It could
  5071.   % all be worked out, but why?  Either we support ^^ or we don't.
  5072.   % The other change necessary for this was to define \auxhat:
  5073.   % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
  5074.   % and then to call \auxhat in \setq.
  5075.   \catcode`\^=\other
  5076.   % Special characters.  Should be turned off anyway, but...
  5077.   \catcode`\~=\other
  5078.   \catcode`\[=\other
  5079.   \catcode`\]=\other
  5080.   \catcode`\"=\other
  5081.   \catcode`\_=\other
  5082.   \catcode`\|=\other
  5083.   \catcode`\<=\other
  5084.   \catcode`\>=\other
  5085.   \catcode`\$=\other
  5086.   \catcode`\#=\other
  5087.   \catcode`\&=\other
  5088.   \catcode`\%=\other
  5089.   \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
  5090.   % This is to support \ in node names and titles, since the \
  5091.   % characters end up in a \csname.  It's easier than
  5092.   % leaving it active and making its active definition an actual \
  5093.   % character.  What I don't understand is why it works in the *value*
  5094.   % of the xrdef.  Seems like it should be a catcode12 \, and that
  5095.   % should not typeset properly.  But it works, so I'm moving on for
  5096.   % now.  --karl, 15jan04.
  5097.   \catcode`\\=\other
  5098.   % Make the characters 128-255 be printing characters.
  5099.     \count1=128
  5100.     \def\loop{%
  5101.       \catcode\count1=\other
  5102.       \advance\count1 by 1
  5103.       \ifnum \count1<256 \loop \fi
  5104.     }%
  5105.   % @ is our escape character in .aux files, and we need braces.
  5106.   \catcode`\{=1
  5107.   \catcode`\}=2
  5108.   \catcode`\@=0
  5109. \def\readdatafile#1{%
  5110. \begingroup
  5111.   \setupdatafile
  5112.   \input\jobname.#1
  5113. \endgroup}
  5114. \message{insertions,}
  5115. % including footnotes.
  5116. \newcount \footnoteno
  5117. % The trailing space in the following definition for supereject is
  5118. % vital for proper filling; pages come out unaligned when you do a
  5119. % pagealignmacro call if that space before the closing brace is
  5120. % removed. (Generally, numeric constants should always be followed by a
  5121. % space to prevent strange expansion errors.)
  5122. \def\supereject{\par\penalty -20000\footnoteno =0 }
  5123. % @footnotestyle is meaningful for info output only.
  5124. \let\footnotestyle=\comment
  5125. {\catcode `\@=11
  5126. % Auto-number footnotes.  Otherwise like plain.
  5127. \gdef\footnote{%
  5128.   \let\indent=\ptexindent
  5129.   \let\noindent=\ptexnoindent
  5130.   \global\advance\footnoteno by \@ne
  5131.   \edef\thisfootno{$^{\the\footnoteno}$}%
  5132.   % In case the footnote comes at the end of a sentence, preserve the
  5133.   % extra spacing after we do the footnote number.
  5134.   \let\@sf\empty
  5135.   \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
  5136.   % Remove inadvertent blank space before typesetting the footnote number.
  5137.   \unskip
  5138.   \thisfootno\@sf
  5139.   \dofootnote
  5140. % Don't bother with the trickery in plain.tex to not require the
  5141. % footnote text as a parameter.  Our footnotes don't need to be so general.
  5142. % Oh yes, they do; otherwise, @ifset (and anything else that uses
  5143. % \parseargline) fails inside footnotes because the tokens are fixed when
  5144. % the footnote is read.  --karl, 16nov96.
  5145. \gdef\dofootnote{%
  5146.   \insert\footins\bgroup
  5147.   % We want to typeset this text as a normal paragraph, even if the
  5148.   % footnote reference occurs in (for example) a display environment.
  5149.   % So reset some parameters.
  5150.   \hsize=\pagewidth
  5151.   \interlinepenalty\interfootnotelinepenalty
  5152.   \splittopskip\ht\strutbox % top baseline for broken footnotes
  5153.   \splitmaxdepth\dp\strutbox
  5154.   \floatingpenalty\@MM
  5155.   \leftskip\z@skip
  5156.   \rightskip\z@skip
  5157.   \spaceskip\z@skip
  5158.   \xspaceskip\z@skip
  5159.   \parindent\defaultparindent
  5160.   \smallfonts \rm
  5161.   % Because we use hanging indentation in footnotes, a @noindent appears
  5162.   % to exdent this text, so make it be a no-op.  makeinfo does not use
  5163.   % hanging indentation so @noindent can still be needed within footnote
  5164.   % text after an @example or the like (not that this is good style).
  5165.   \let\noindent = \relax
  5166.   % Hang the footnote text off the number.  Use \everypar in case the
  5167.   % footnote extends for more than one paragraph.
  5168.   \everypar = {\hang}%
  5169.   \textindent{\thisfootno}%
  5170.   % Don't crash into the line above the footnote text.  Since this
  5171.   % expands into a box, it must come within the paragraph, lest it
  5172.   % provide a place where TeX can split the footnote.
  5173.   \footstrut
  5174.   \futurelet\next\fo@t
  5175. }%end \catcode `\@=11
  5176. % In case a @footnote appears in a vbox, save the footnote text and create
  5177. % the real \insert just after the vbox finished.  Otherwise, the insertion
  5178. % would be lost.
  5179. % Similarily, if a @footnote appears inside an alignment, save the footnote
  5180. % text to a box and make the \insert when a row of the table is finished.
  5181. % And the same can be done for other insert classes.  --kasal, 16nov03.
  5182. % Replace the \insert primitive by a cheating macro.
  5183. % Deeper inside, just make sure that the saved insertions are not spilled
  5184. % out prematurely.
  5185. \def\startsavinginserts{%
  5186.   \ifx \insert\ptexinsert
  5187.     \let\insert\saveinsert
  5188.   \else
  5189.     \let\checkinserts\relax
  5190.   \fi
  5191. % This \insert replacement works for both \insert\footins{foo} and
  5192. % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
  5193. \def\saveinsert#1{%
  5194.   \edef\next{\noexpand\savetobox \makeSAVEname#1}%
  5195.   \afterassignment\next
  5196.   % swallow the left brace
  5197.   \let\temp =
  5198. \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
  5199. \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
  5200. \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
  5201. \def\placesaveins#1{%
  5202.   \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
  5203.     {\box#1}%
  5204. % eat @SAVE -- beware, all of them have catcode \other:
  5205.   \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
  5206.   \gdef\gobblesave @SAVE{}
  5207. % initialization:
  5208. \def\newsaveins #1{%
  5209.   \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
  5210.   \next
  5211. \def\newsaveinsX #1{%
  5212.   \csname newbox\endcsname #1%
  5213.   \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
  5214.     \checksaveins #1}%
  5215. % initialize:
  5216. \let\checkinserts\empty
  5217. \newsaveins\footins
  5218. \newsaveins\margin
  5219. % @image.  We use the macros from epsf.tex to support this.
  5220. % If epsf.tex is not installed and @image is used, we complain.
  5221. % Check for and read epsf.tex up front.  If we read it only at @image
  5222. % time, we might be inside a group, and then its definitions would get
  5223. % undone and the next image would fail.
  5224. \openin 1 = epsf.tex
  5225. \ifeof 1 \else
  5226.   % Do not bother showing banner with epsf.tex v2.7k (available in
  5227.   % doc/epsf.tex and on ctan).
  5228.   \def\epsfannounce{\toks0 = }%
  5229.   \input epsf.tex
  5230. \closein 1
  5231. % We will only complain once about lack of epsf.tex.
  5232. \newif\ifwarnednoepsf
  5233. \newhelp\noepsfhelp{epsf.tex must be installed for images to
  5234.   work.  It is also included in the Texinfo distribution, or you can get
  5235.   it from ftp://tug.org/tex/epsf.tex.}
  5236. \def\image#1{%
  5237.   \ifx\epsfbox\undefined
  5238.     \ifwarnednoepsf \else
  5239.       \errhelp = \noepsfhelp
  5240.       \errmessage{epsf.tex not found, images will be ignored}%
  5241.       \global\warnednoepsftrue
  5242.     \fi
  5243.   \else
  5244.     \imagexxx #1,,,,,\finish
  5245.   \fi
  5246. % Arguments to @image:
  5247. % #1 is (mandatory) image filename; we tack on .eps extension.
  5248. % #2 is (optional) width, #3 is (optional) height.
  5249. % #4 is (ignored optional) html alt text.
  5250. % #5 is (ignored optional) extension.
  5251. % #6 is just the usual extra ignored arg for parsing this stuff.
  5252. \newif\ifimagevmode
  5253. \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
  5254.   \catcode`\^^M = 5     % in case we're inside an example
  5255.   \normalturnoffactive  % allow _ et al. in names
  5256.   % If the image is by itself, center it.
  5257.   \ifvmode
  5258.     \imagevmodetrue
  5259.     \nobreak\bigskip
  5260.     % Usually we'll have text after the image which will insert
  5261.     % \parskip glue, so insert it here too to equalize the space
  5262.     % above and below.
  5263.     \nobreak\vskip\parskip
  5264.     \nobreak
  5265.     \line\bgroup\hss
  5266.   \fi
  5267.   % Output the image.
  5268.   \ifpdf
  5269.     \dopdfimage{#1}{#2}{#3}%
  5270.   \else
  5271.     % \epsfbox itself resets \epsf?size at each figure.
  5272.     \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
  5273.     \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
  5274.     \epsfbox{#1.eps}%
  5275.   \fi
  5276.   \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
  5277. \endgroup}
  5278. % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
  5279. % etc.  We don't actually implement floating yet, we always include the
  5280. % float "here".  But it seemed the best name for the future.
  5281. \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
  5282. % There may be a space before second and/or third parameter; delete it.
  5283. \def\eatcommaspace#1, {#1,}
  5284. % #1 is the optional FLOATTYPE, the text label for this float, typically
  5285. % "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
  5286. % this float will not be numbered and cannot be referred to.
  5287. % #2 is the optional xref label.  Also must be present for the float to
  5288. % be referable.
  5289. % #3 is the optional positioning argument; for now, it is ignored.  It
  5290. % will somehow specify the positions allowed to float to (here, top, bottom).
  5291. % We keep a separate counter for each FLOATTYPE, which we reset at each
  5292. % chapter-level command.
  5293. \let\resetallfloatnos=\empty
  5294. \def\dofloat#1,#2,#3,#4\finish{%
  5295.   \let\thiscaption=\empty
  5296.   \let\thisshortcaption=\empty
  5297.   % don't lose footnotes inside @float.
  5298.   % BEWARE: when the floats start float, we have to issue warning whenever an
  5299.   % insert appears inside a float which could possibly float. --kasal, 26may04
  5300.   \startsavinginserts
  5301.   % We can't be used inside a paragraph.
  5302.   \par
  5303.   \vtop\bgroup
  5304.     \def\floattype{#1}%
  5305.     \def\floatlabel{#2}%
  5306.     \def\floatloc{#3}% we do nothing with this yet.
  5307.     %
  5308.     \ifx\floattype\empty
  5309.       \let\safefloattype=\empty
  5310.     \else
  5311.       {%
  5312.         % the floattype might have accents or other special characters,
  5313.         % but we need to use it in a control sequence name.
  5314.         \indexnofonts
  5315.         \turnoffactive
  5316.         \xdef\safefloattype{\floattype}%
  5317.       }%
  5318.     \fi
  5319.     %
  5320.     % If label is given but no type, we handle that as the empty type.
  5321.     \ifx\floatlabel\empty \else
  5322.       % We want each FLOATTYPE to be numbered separately (Figure 1,
  5323.       % Table 1, Figure 2, ...).  (And if no label, no number.)
  5324.       %
  5325.       \expandafter\getfloatno\csname\safefloattype floatno\endcsname
  5326.       \global\advance\floatno by 1
  5327.       %
  5328.       {%
  5329.         % This magic value for \thissection is output by \setref as the
  5330.         % XREFLABEL-title value.  \xrefX uses it to distinguish float
  5331.         % labels (which have a completely different output format) from
  5332.         % node and anchor labels.  And \xrdef uses it to construct the
  5333.         % lists of floats.
  5334.         %
  5335.         \edef\thissection{\floatmagic=\safefloattype}%
  5336.         \setref{\floatlabel}{Yfloat}%
  5337.       }%
  5338.     \fi
  5339.     %
  5340.     % start with \parskip glue, I guess.
  5341.     \vskip\parskip
  5342.     %
  5343.     % Don't suppress indentation if a float happens to start a section.
  5344.     \restorefirstparagraphindent
  5345. % we have these possibilities:
  5346. % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
  5347. % @float Foo,lbl & no caption:    Foo 1.1
  5348. % @float Foo & @caption{Cap}:     Foo: Cap
  5349. % @float Foo & no caption:        Foo
  5350. % @float ,lbl & Caption{Cap}:     1.1: Cap
  5351. % @float ,lbl & no caption:       1.1
  5352. % @float & @caption{Cap}:         Cap
  5353. % @float & no caption:
  5354. \def\Efloat{%
  5355.     \let\floatident = \empty
  5356.     %
  5357.     % In all cases, if we have a float type, it comes first.
  5358.     \ifx\floattype\empty \else \def\floatident{\floattype}\fi
  5359.     %
  5360.     % If we have an xref label, the number comes next.
  5361.     \ifx\floatlabel\empty \else
  5362.       \ifx\floattype\empty \else % if also had float type, need tie first.
  5363.         \appendtomacro\floatident{\tie}%
  5364.       \fi
  5365.       % the number.
  5366.       \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
  5367.     \fi
  5368.     %
  5369.     % Start the printed caption with what we've constructed in
  5370.     % \floatident, but keep it separate; we need \floatident again.
  5371.     \let\captionline = \floatident
  5372.     %
  5373.     \ifx\thiscaption\empty \else
  5374.       \ifx\floatident\empty \else
  5375.     \appendtomacro\captionline{: }% had ident, so need a colon between
  5376.       \fi
  5377.       %
  5378.       % caption text.
  5379.       \appendtomacro\captionline{\scanexp\thiscaption}%
  5380.     \fi
  5381.     %
  5382.     % If we have anything to print, print it, with space before.
  5383.     % Eventually this needs to become an \insert.
  5384.     \ifx\captionline\empty \else
  5385.       \vskip.5\parskip
  5386.       \captionline
  5387.       %
  5388.       % Space below caption.
  5389.       \vskip\parskip
  5390.     \fi
  5391.     %
  5392.     % If have an xref label, write the list of floats info.  Do this
  5393.     % after the caption, to avoid chance of it being a breakpoint.
  5394.     \ifx\floatlabel\empty \else
  5395.       % Write the text that goes in the lof to the aux file as
  5396.       % \floatlabel-lof.  Besides \floatident, we include the short
  5397.       % caption if specified, else the full caption if specified, else nothing.
  5398.       {%
  5399.         \atdummies
  5400.         % since we read the caption text in the macro world, where ^^M
  5401.         % is turned into a normal character, we have to scan it back, so
  5402.         % we don't write the literal three characters "^^M" into the aux file.
  5403.     \scanexp{%
  5404.       \xdef\noexpand\gtemp{%
  5405.         \ifx\thisshortcaption\empty
  5406.           \thiscaption
  5407.         \else
  5408.           \thisshortcaption
  5409.         \fi
  5410.       }%
  5411.         \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
  5412.       \ifx\gtemp\empty \else : \gtemp \fi}}%
  5413.       }%
  5414.     \fi
  5415.   \egroup  % end of \vtop
  5416.   % place the captured inserts
  5417.   % BEWARE: when the floats start float, we have to issue warning whenever an
  5418.   % insert appears inside a float which could possibly float. --kasal, 26may04
  5419.   \checkinserts
  5420. % Append the tokens #2 to the definition of macro #1, not expanding either.
  5421. \def\appendtomacro#1#2{%
  5422.   \expandafter\def\expandafter#1\expandafter{#1#2}%
  5423. % @caption, @shortcaption
  5424. \def\caption{\docaption\thiscaption}
  5425. \def\shortcaption{\docaption\thisshortcaption}
  5426. \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
  5427. \def\defcaption#1#2{\egroup \def#1{#2}}
  5428. % The parameter is the control sequence identifying the counter we are
  5429. % going to use.  Create it if it doesn't exist and assign it to \floatno.
  5430. \def\getfloatno#1{%
  5431.   \ifx#1\relax
  5432.       % Haven't seen this figure type before.
  5433.       \csname newcount\endcsname #1%
  5434.       %
  5435.       % Remember to reset this floatno at the next chap.
  5436.       \expandafter\gdef\expandafter\resetallfloatnos
  5437.         \expandafter{\resetallfloatnos #1=0 }%
  5438.   \fi
  5439.   \let\floatno#1%
  5440. % \setref calls this to get the XREFLABEL-snt value.  We want an @xref
  5441. % to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
  5442. % first read the @float command.
  5443. \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
  5444. % Magic string used for the XREFLABEL-title value, so \xrefX can
  5445. % distinguish floats from other xref types.
  5446. \def\floatmagic{!!float!!}
  5447. % #1 is the control sequence we are passed; we expand into a conditional
  5448. % which is true if #1 represents a float ref.  That is, the magic
  5449. % \thissection value which we \setref above.
  5450. \def\iffloat#1{\expandafter\doiffloat#1==\finish}
  5451. % #1 is (maybe) the \floatmagic string.  If so, #2 will be the
  5452. % (safe) float type for this float.  We set \iffloattype to #2.
  5453. \def\doiffloat#1=#2=#3\finish{%
  5454.   \def\temp{#1}%
  5455.   \def\iffloattype{#2}%
  5456.   \ifx\temp\floatmagic
  5457. % @listoffloats FLOATTYPE - print a list of floats like a table of contents.
  5458. \parseargdef\listoffloats{%
  5459.   \def\floattype{#1}% floattype
  5460.     % the floattype might have accents or other special characters,
  5461.     % but we need to use it in a control sequence name.
  5462.     \indexnofonts
  5463.     \turnoffactive
  5464.     \xdef\safefloattype{\floattype}%
  5465.   % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
  5466.   \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
  5467.     \ifhavexrefs
  5468.       % if the user said @listoffloats foo but never @float foo.
  5469.       \message{\linenumber No `\safefloattype' floats to list.}%
  5470.     \fi
  5471.   \else
  5472.     \begingroup
  5473.       \leftskip=\tocindent  % indent these entries like a toc
  5474.       \let\do=\listoffloatsdo
  5475.       \csname floatlist\safefloattype\endcsname
  5476.     \endgroup
  5477.   \fi
  5478. % This is called on each entry in a list of floats.  We're passed the
  5479. % xref label, in the form LABEL-title, which is how we save it in the
  5480. % aux file.  We strip off the -title and look up \XRLABEL-lof, which
  5481. % has the text we're supposed to typeset here.
  5482. % Figures without xref labels will not be included in the list (since
  5483. % they won't appear in the aux file).
  5484. \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
  5485. \def\listoffloatsdoentry#1-title\finish{{%
  5486.   % Can't fully expand XR#1-lof because it can contain anything.  Just
  5487.   % pass the control sequence.  On the other hand, XR#1-pg is just the
  5488.   % page number, and we want to fully expand that so we can get a link
  5489.   % in pdf output.
  5490.   \toksA = \expandafter{\csname XR#1-lof\endcsname}%
  5491.   % use the same \entry macro we use to generate the TOC and index.
  5492.   \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
  5493.   \writeentry
  5494. \message{localization,}
  5495. % and i18n.
  5496. % @documentlanguage is usually given very early, just after
  5497. % @setfilename.  If done too late, it may not override everything
  5498. % properly.  Single argument is the language abbreviation.
  5499. % It would be nice if we could set up a hyphenation file here.
  5500. \parseargdef\documentlanguage{%
  5501.   \tex % read txi-??.tex file in plain TeX.
  5502.     % Read the file if it exists.
  5503.     \openin 1 txi-#1.tex
  5504.     \ifeof 1
  5505.       \errhelp = \nolanghelp
  5506.       \errmessage{Cannot read language file txi-#1.tex}%
  5507.     \else
  5508.       \input txi-#1.tex
  5509.     \fi
  5510.     \closein 1
  5511.   \endgroup
  5512. \newhelp\nolanghelp{The given language definition file cannot be found or
  5513. is empty.  Maybe you need to install it?  In the current directory
  5514. should work if nowhere else does.}
  5515. % @documentencoding should change something in TeX eventually, most
  5516. % likely, but for now just recognize it.
  5517. \let\documentencoding = \comment
  5518. % Page size parameters.
  5519. \newdimen\defaultparindent \defaultparindent = 15pt
  5520. \chapheadingskip = 15pt plus 4pt minus 2pt
  5521. \secheadingskip = 12pt plus 3pt minus 2pt
  5522. \subsecheadingskip = 9pt plus 2pt minus 2pt
  5523. % Prevent underfull vbox error messages.
  5524. \vbadness = 10000
  5525. % Don't be so finicky about underfull hboxes, either.
  5526. \hbadness = 2000
  5527. % Following George Bush, just get rid of widows and orphans.
  5528. \widowpenalty=10000
  5529. \clubpenalty=10000
  5530. % Use TeX 3.0's \emergencystretch to help line breaking, but if we're
  5531. % using an old version of TeX, don't do anything.  We want the amount of
  5532. % stretch added to depend on the line length, hence the dependence on
  5533. % \hsize.  We call this whenever the paper size is set.
  5534. \def\setemergencystretch{%
  5535.   \ifx\emergencystretch\thisisundefined
  5536.     % Allow us to assign to \emergencystretch anyway.
  5537.     \def\emergencystretch{\dimen0}%
  5538.   \else
  5539.     \emergencystretch = .15\hsize
  5540.   \fi
  5541. % Parameters in order: 1) textheight; 2) textwidth;
  5542. % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
  5543. % 7) physical page height; 8) physical page width.
  5544. % We also call \setleading{\textleading}, so the caller should define
  5545. % \textleading.  The caller should also set \parskip.
  5546. \def\internalpagesizes#1#2#3#4#5#6#7#8{%
  5547.   \voffset = #3\relax
  5548.   \topskip = #6\relax
  5549.   \splittopskip = \topskip
  5550.   \vsize = #1\relax
  5551.   \advance\vsize by \topskip
  5552.   \outervsize = \vsize
  5553.   \advance\outervsize by 2\topandbottommargin
  5554.   \pageheight = \vsize
  5555.   \hsize = #2\relax
  5556.   \outerhsize = \hsize
  5557.   \advance\outerhsize by 0.5in
  5558.   \pagewidth = \hsize
  5559.   \normaloffset = #4\relax
  5560.   \bindingoffset = #5\relax
  5561.   \ifpdf
  5562.     \pdfpageheight #7\relax
  5563.     \pdfpagewidth #8\relax
  5564.   \fi
  5565.   \setleading{\textleading}
  5566.   \parindent = \defaultparindent
  5567.   \setemergencystretch
  5568. % @letterpaper (the default).
  5569. \def\letterpaper{{\globaldefs = 1
  5570.   \parskip = 3pt plus 2pt minus 1pt
  5571.   \textleading = 13.2pt
  5572.   % If page is nothing but text, make it come out even.
  5573.   \internalpagesizes{46\baselineskip}{6in}%
  5574.                     {\voffset}{.25in}%
  5575.                     {\bindingoffset}{36pt}%
  5576.                     {11in}{8.5in}%
  5577. % Use @smallbook to reset parameters for 7x9.25 trim size.
  5578. \def\smallbook{{\globaldefs = 1
  5579.   \parskip = 2pt plus 1pt
  5580.   \textleading = 12pt
  5581.   \internalpagesizes{7.5in}{5in}%
  5582.                     {\voffset}{.25in}%
  5583.                     {\bindingoffset}{16pt}%
  5584.                     {9.25in}{7in}%
  5585.   \lispnarrowing = 0.3in
  5586.   \tolerance = 700
  5587.   \hfuzz = 1pt
  5588.   \contentsrightmargin = 0pt
  5589.   \defbodyindent = .5cm
  5590. % Use @smallerbook to reset parameters for 6x9 trim size.
  5591. % (Just testing, parameters still in flux.)
  5592. \def\smallerbook{{\globaldefs = 1
  5593.   \parskip = 1.5pt plus 1pt
  5594.   \textleading = 12pt
  5595.   \internalpagesizes{7.4in}{4.8in}%
  5596.                     {-.2in}{-.4in}%
  5597.                     {0pt}{14pt}%
  5598.                     {9in}{6in}%
  5599.   \lispnarrowing = 0.25in
  5600.   \tolerance = 700
  5601.   \hfuzz = 1pt
  5602.   \contentsrightmargin = 0pt
  5603.   \defbodyindent = .4cm
  5604. % Use @afourpaper to print on European A4 paper.
  5605. \def\afourpaper{{\globaldefs = 1
  5606.   \parskip = 3pt plus 2pt minus 1pt
  5607.   \textleading = 13.2pt
  5608.   % Double-side printing via postscript on Laserjet 4050
  5609.   % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
  5610.   % To change the settings for a different printer or situation, adjust
  5611.   % \normaloffset until the front-side and back-side texts align.  Then
  5612.   % do the same for \bindingoffset.  You can set these for testing in
  5613.   % your texinfo source file like this:
  5614.   % @tex
  5615.   % \global\normaloffset = -6mm
  5616.   % \global\bindingoffset = 10mm
  5617.   % @end tex
  5618.   \internalpagesizes{51\baselineskip}{160mm}
  5619.                     {\voffset}{\hoffset}%
  5620.                     {\bindingoffset}{44pt}%
  5621.                     {297mm}{210mm}%
  5622.   \tolerance = 700
  5623.   \hfuzz = 1pt
  5624.   \contentsrightmargin = 0pt
  5625.   \defbodyindent = 5mm
  5626. % Use @afivepaper to print on European A5 paper.
  5627. % From romildo@urano.iceb.ufop.br, 2 July 2000.
  5628. % He also recommends making @example and @lisp be small.
  5629. \def\afivepaper{{\globaldefs = 1
  5630.   \parskip = 2pt plus 1pt minus 0.1pt
  5631.   \textleading = 12.5pt
  5632.   \internalpagesizes{160mm}{120mm}%
  5633.                     {\voffset}{\hoffset}%
  5634.                     {\bindingoffset}{8pt}%
  5635.                     {210mm}{148mm}%
  5636.   \lispnarrowing = 0.2in
  5637.   \tolerance = 800
  5638.   \hfuzz = 1.2pt
  5639.   \contentsrightmargin = 0pt
  5640.   \defbodyindent = 2mm
  5641.   \tableindent = 12mm
  5642. % A specific text layout, 24x15cm overall, intended for A4 paper.
  5643. \def\afourlatex{{\globaldefs = 1
  5644.   \afourpaper
  5645.   \internalpagesizes{237mm}{150mm}%
  5646.                     {\voffset}{4.6mm}%
  5647.                     {\bindingoffset}{7mm}%
  5648.                     {297mm}{210mm}%
  5649.   % Must explicitly reset to 0 because we call \afourpaper.
  5650.   \globaldefs = 0
  5651. % Use @afourwide to print on A4 paper in landscape format.
  5652. \def\afourwide{{\globaldefs = 1
  5653.   \afourpaper
  5654.   \internalpagesizes{241mm}{165mm}%
  5655.                     {\voffset}{-2.95mm}%
  5656.                     {\bindingoffset}{7mm}%
  5657.                     {297mm}{210mm}%
  5658.   \globaldefs = 0
  5659. % @pagesizes TEXTHEIGHT[,TEXTWIDTH]
  5660. % Perhaps we should allow setting the margins, \topskip, \parskip,
  5661. % and/or leading, also. Or perhaps we should compute them somehow.
  5662. \parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
  5663. \def\pagesizesyyy#1,#2,#3\finish{{%
  5664.   \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
  5665.   \globaldefs = 1
  5666.   \parskip = 3pt plus 2pt minus 1pt
  5667.   \setleading{\textleading}%
  5668.   \dimen0 = #1
  5669.   \advance\dimen0 by \voffset
  5670.   \dimen2 = \hsize
  5671.   \advance\dimen2 by \normaloffset
  5672.   \internalpagesizes{#1}{\hsize}%
  5673.                     {\voffset}{\normaloffset}%
  5674.                     {\bindingoffset}{44pt}%
  5675.                     {\dimen0}{\dimen2}%
  5676. % Set default to letter.
  5677. \letterpaper
  5678. \message{and turning on texinfo input format.}
  5679. % Define macros to output various characters with catcode for normal text.
  5680. \catcode`\"=\other
  5681. \catcode`\~=\other
  5682. \catcode`\^=\other
  5683. \catcode`\_=\other
  5684. \catcode`\|=\other
  5685. \catcode`\<=\other
  5686. \catcode`\>=\other
  5687. \catcode`\+=\other
  5688. \catcode`\$=\other
  5689. \def\normaldoublequote{"}
  5690. \def\normaltilde{~}
  5691. \def\normalcaret{^}
  5692. \def\normalunderscore{_}
  5693. \def\normalverticalbar{|}
  5694. \def\normalless{<}
  5695. \def\normalgreater{>}
  5696. \def\normalplus{+}
  5697. \def\normaldollar{$}%$ font-lock fix
  5698. % This macro is used to make a character print one way in \tt
  5699. % (where it can probably be output as-is), and another way in other fonts,
  5700. % where something hairier probably needs to be done.
  5701. % #1 is what to print if we are indeed using \tt; #2 is what to print
  5702. % otherwise.  Since all the Computer Modern typewriter fonts have zero
  5703. % interword stretch (and shrink), and it is reasonable to expect all
  5704. % typewriter fonts to have this, we can check that font parameter.
  5705. \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
  5706. % Same as above, but check for italic font.  Actually this also catches
  5707. % non-italic slanted fonts since it is impossible to distinguish them from
  5708. % italic fonts.  But since this is only used by $ and it uses \sl anyway
  5709. % this is not a problem.
  5710. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
  5711. % Turn off all special characters except @
  5712. % (and those which the user can use as if they were ordinary).
  5713. % Most of these we simply print from the \tt font, but for some, we can
  5714. % use math or other variants that look better in normal text.
  5715. \catcode`\"=\active
  5716. \def\activedoublequote{{\tt\char34}}
  5717. \let"=\activedoublequote
  5718. \catcode`\~=\active
  5719. \def~{{\tt\char126}}
  5720. \chardef\hat=`\^
  5721. \catcode`\^=\active
  5722. \def^{{\tt \hat}}
  5723. \catcode`\_=\active
  5724. \def_{\ifusingtt\normalunderscore\_}
  5725. \let\realunder=_
  5726. % Subroutine for the previous macro.
  5727. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
  5728. \catcode`\|=\active
  5729. \def|{{\tt\char124}}
  5730. \chardef \less=`\<
  5731. \catcode`\<=\active
  5732. \def<{{\tt \less}}
  5733. \chardef \gtr=`\>
  5734. \catcode`\>=\active
  5735. \def>{{\tt \gtr}}
  5736. \catcode`\+=\active
  5737. \def+{{\tt \char 43}}
  5738. \catcode`\$=\active
  5739. \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
  5740. % If a .fmt file is being used, characters that might appear in a file
  5741. % name cannot be active until we have parsed the command line.
  5742. % So turn them off again, and have \everyjob (or @setfilename) turn them on.
  5743. % \otherifyactive is called near the end of this file.
  5744. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
  5745. \catcode`\@=0
  5746. % \backslashcurfont outputs one backslash character in current font,
  5747. % as in \char`\\.
  5748. \global\chardef\backslashcurfont=`\\
  5749. \global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
  5750. % \rawbackslash defines an active \ to do \backslashcurfont.
  5751. % \otherbackslash defines an active \ to be a literal `\' character with
  5752. % catcode other.
  5753. {\catcode`\\=\active
  5754.  @gdef@rawbackslash{@let\=@backslashcurfont}
  5755.  @gdef@otherbackslash{@let\=@realbackslash}
  5756. % \realbackslash is an actual character `\' with catcode other, and
  5757. % \doublebackslash is two of them (for the pdf outlines).
  5758. {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
  5759. % \normalbackslash outputs one backslash in fixed width font.
  5760. \def\normalbackslash{{\tt\backslashcurfont}}
  5761. \catcode`\\=\active
  5762. % Used sometimes to turn off (effectively) the active characters
  5763. % even after parsing them.
  5764. @def@turnoffactive{%
  5765.   @let"=@normaldoublequote
  5766.   @let\=@realbackslash
  5767.   @let~=@normaltilde
  5768.   @let^=@normalcaret
  5769.   @let_=@normalunderscore
  5770.   @let|=@normalverticalbar
  5771.   @let<=@normalless
  5772.   @let>=@normalgreater
  5773.   @let+=@normalplus
  5774.   @let$=@normaldollar %$ font-lock fix
  5775.   @unsepspaces
  5776. % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
  5777. % the literal character `\'.  (Thus, \ is not expandable when this is in
  5778. % effect.)
  5779. @def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
  5780. % Make _ and + \other characters, temporarily.
  5781. % This is canceled by @fixbackslash.
  5782. @otherifyactive
  5783. % If a .fmt file is being used, we don't want the `\input texinfo' to show up.
  5784. % That is what \eatinput is for; after that, the `\' should revert to printing
  5785. % a backslash.
  5786. @gdef@eatinput input texinfo{@fixbackslash}
  5787. @global@let\ = @eatinput
  5788. % On the other hand, perhaps the file did not have a `\input texinfo'. Then
  5789. % the first `\{ in the file would cause an error. This macro tries to fix
  5790. % that, assuming it is called before the first `\' could plausibly occur.
  5791. % Also turn back on active characters that might appear in the input
  5792. % file name, in case not using a pre-dumped format.
  5793. @gdef@fixbackslash{%
  5794.   @ifx\@eatinput @let\ = @normalbackslash @fi
  5795.   @catcode`+=@active
  5796.   @catcode`@_=@active
  5797. % Say @foo, not \foo, in error messages.
  5798. @escapechar = `@@
  5799. % These look ok in all fonts, so just make them not special.
  5800. @catcode`@& = @other
  5801. @catcode`@# = @other
  5802. @catcode`@% = @other
  5803. @c Local variables:
  5804. @c eval: (add-hook 'write-file-hooks 'time-stamp)
  5805. @c page-delimiter: "^\\\\message"
  5806. @c time-stamp-start: "def\\\\texinfoversion{"
  5807. @c time-stamp-format: "%:y-%02m-%02d.%02H"
  5808. @c time-stamp-end: "}"
  5809. @c End:
  5810. @c vim:sw=2:
  5811. @ignore
  5812.    arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
  5813. @end ignore
  5814.